Merge
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index fe5a0b6..cec8ccb 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -4,3 +4,4 @@
 11b4dc9f2be3523ef989a0db8459eb56b3045c3a jdk7-b27
 56652b46f328937f6b9b5130f1e4cd80f48868ef jdk7-b28
 31e08f70e88d77c2053f91c21b49a04296bdc59a jdk7-b29
+2dab2f712e1832c92acfa63ec0337048b9422c20 jdk7-b30
diff --git a/corba/.hgtags b/corba/.hgtags
index bf08228..c2bfd6f 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -4,3 +4,4 @@
 e84e9018bebbf3e5bafc5706e7882a15cb1c7d99 jdk7-b27
 27509b7d21ed783b3f6eb7b7612781c675a30c2f jdk7-b28
 8b71960f79ce0a6fb8ddfeec03f03d400a361747 jdk7-b29
+c0252adbb2abbfdd6c35595429ac6fbdd98e20ac jdk7-b30
diff --git a/hotspot/.hgignore b/hotspot/.hgignore
index 24a1919..2c5fe5b 100644
--- a/hotspot/.hgignore
+++ b/hotspot/.hgignore
@@ -2,3 +2,6 @@
 ^dist/
 ^nbproject/private/
 ^src/share/tools/hsdis/bin/
+^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/
+^src/share/tools/IdealGraphVisualizer/build/
+^src/share/tools/IdealGraphVisualizer/dist/
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index 5d199e5..1c7dc2a 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -4,3 +4,4 @@
 e3d2692f8442e2d951166dc9bd9a330684754438 jdk7-b27
 c14dab40ed9bf45ad21150bd70c9c80cdf655415 jdk7-b28
 4f91c08b3e4498213a9c5a24898f7d9c38cf86fb jdk7-b29
+d1605aabd0a15ecf93787c47de63073c33fba52d jdk7-b30
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
index cfd759a..23e5333 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
@@ -316,6 +316,14 @@
     iterateLiveRegions(liveRegions, visitor, null);
   }
 
+  public boolean isValidMethod(OopHandle handle) {
+    OopHandle klass = Oop.getKlassForOopHandle(handle);
+    if (klass != null && klass.equals(methodKlassHandle)) {
+      return true;
+    }
+    return false;
+  }
+
   // Creates an instance from the Oop hierarchy based based on the handle
   public Oop newOop(OopHandle handle) {
     // The only known way to detect the right type of an oop is
@@ -375,8 +383,10 @@
       }
     }
 
-    System.err.println("Unknown oop at " + handle);
-    System.err.println("Oop's klass is " + klass);
+    if (DEBUG) {
+      System.err.println("Unknown oop at " + handle);
+      System.err.println("Oop's klass is " + klass);
+    }
 
     throw new UnknownOopException();
   }
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
index 43ad81d..204156c 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
@@ -215,11 +215,11 @@
     if (f == null) return null;
     boolean imprecise = true;
     if (f.isInterpretedFrame() && !f.isInterpretedFrameValid()) {
-      if (DEBUG) {
-        System.out.println("Correcting for invalid interpreter frame");
-      }
-      f = f.sender(regMap);
-      imprecise = false;
+       if (DEBUG) {
+         System.out.println("Correcting for invalid interpreter frame");
+       }
+       f = f.sender(regMap);
+       imprecise = false;
     }
     VFrame vf = VFrame.newVFrame(f, regMap, this, true, imprecise);
     if (vf == null) {
@@ -228,10 +228,7 @@
       }
       return null;
     }
-    if (vf.isJavaFrame()) {
-      return (JavaVFrame) vf;
-    }
-    return (JavaVFrame) vf.javaSender();
+    return vf.isJavaFrame() ? (JavaVFrame)vf : vf.javaSender();
   }
 
   /** In this system, a JavaThread is the top-level factory for a
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java
index 7d42c21..93b5acf 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java
@@ -121,6 +121,13 @@
   }
 
   public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
+
+    // If java stack is walkable then both last_Java_sp and last_Java_pc are
+    // non null and we can start stack walk from this frame.
+    if (thread.getLastJavaSP() != null && thread.getLastJavaPC() != null) {
+      return new SPARCFrame(SPARCFrame.biasSP(thread.getLastJavaSP()), thread.getLastJavaPC());
+    }
+
     ThreadProxy t = getThreadProxy(addr);
     SPARCThreadContext context = (SPARCThreadContext) t.getContext();
     // For now, let's see what happens if we do a similar thing to
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
index 0153291..b9c07b6 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
@@ -422,6 +422,13 @@
     if (getFP().addOffsetTo(INTERPRETER_FRAME_VM_LOCAL_WORDS * VM.getVM().getAddressSize()).lessThan(getSP())) {
       return false;
     }
+
+    OopHandle methodHandle = addressOfInterpreterFrameMethod().getOopHandleAt(0);
+
+    if (VM.getVM().getObjectHeap().isValidMethod(methodHandle) == false) {
+      return false;
+    }
+
     // These are hacks to keep us out of trouble.
     // The problem with these is that they mask other problems
     if (getFP().lessThanOrEqual(getSP())) {        // this attempts to deal with unsigned comparison above
@@ -433,9 +440,18 @@
     // FIXME: this is not atomic with respect to GC and is unsuitable
     // for use in a non-debugging, or reflective, system. Need to
     // figure out how to express this.
-    if (addressOfInterpreterFrameBCX().getAddressAt(0) == null) {
-      return false; // BCP not yet set up
+    Address bcx =  addressOfInterpreterFrameBCX().getAddressAt(0);
+
+    Method method;
+    try {
+       method = (Method) VM.getVM().getObjectHeap().newOop(methodHandle);
+    } catch (UnknownOopException ex) {
+       return false;
     }
+    int  bci = bcpToBci(bcx, method);
+    //validate bci
+    if (bci < 0) return false;
+
     return true;
   }
 
@@ -471,7 +487,7 @@
     // will update it accordingly
     map.setIncludeArgumentOops(false);
 
-    if (cb == null && isEntryFrame()) {
+    if (isEntryFrame()) {
       return senderForEntryFrame(map);
     }
 
@@ -539,7 +555,6 @@
         int SP_OFFSET_IN_GREGSET = 17;
         raw_sp = fp.getAddressAt(VM.getVM().getAddressSize() * SP_OFFSET_IN_GREGSET);
         Address pc = fp.getAddressAt(VM.getVM().getAddressSize() * PC_OFFSET_IN_GREGSET);
-        // System.out.println("  next frame's SP: " + sp + " PC: " + pc);
         return new SPARCFrame(raw_sp, pc);
       }
     }
@@ -562,10 +577,8 @@
       // sender's _interpreter_sp_adjustment field.
       if (VM.getVM().getInterpreter().contains(pc)) {
         isInterpreted = true;
-        if (VM.getVM().isClientCompiler()) {
-          map.makeIntegerRegsUnsaved();
-          map.shiftWindow(sp, youngerSP);
-        }
+        map.makeIntegerRegsUnsaved();
+        map.shiftWindow(sp, youngerSP);
       } else {
         // Find a CodeBlob containing this frame's pc or elide the lookup and use the
         // supplied blob which is already known to be associated with this frame.
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
index 9bab664..a928d56 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java
@@ -87,12 +87,13 @@
                while (f != null) {
                   ClosestSymbol sym = f.closestSymbolToPC();
                   Address pc = f.pc();
+                  out.print(pc + "\t");
                   if (sym != null) {
                      String name = sym.getName();
                      if (cdbgCanDemangle) {
                         name = cdbg.demangle(name);
                      }
-                     out.print(pc + "\t" + name);
+                     out.print(name);
                      long diff = sym.getOffset();
                      if (diff != 0L) {
                         out.print(" + 0x" + Long.toHexString(diff));
@@ -120,7 +121,6 @@
                            // look for known code blobs
                            CodeCache c = VM.getVM().getCodeCache();
                            if (c.contains(pc)) {
-                              out.print(pc + "\t");
                               CodeBlob cb = c.findBlobUnsafe(pc);
                               if (cb.isNMethod()) {
                                  names = getJavaNames(th, f.localVariableBase());
@@ -144,18 +144,18 @@
                                  out.println("<Unknown code blob>");
                               }
                            } else {
-                              printUnknown(out,pc);
+                              printUnknown(out);
                            }
                         }
                         // print java frames, if any
                         if (names != null && names.length != 0) {
                            // print java frame(s)
                            for (int i = 0; i < names.length; i++) {
-                               out.println(pc + "\t" + names[i]);
+                               out.println(names[i]);
                            }
                         }
                      } else {
-                        printUnknown(out,pc);
+                        printUnknown(out);
                      }
                   }
                   f = f.sender();
@@ -220,8 +220,8 @@
       }
    }
 
-   private void printUnknown(PrintStream out, Address pc) {
-      out.println(pc + "\t????????");
+   private void printUnknown(PrintStream out) {
+      out.println("\t????????");
    }
 
    private String[] getJavaNames(ThreadProxy th, Address fp) {
diff --git a/hotspot/make/defs.make b/hotspot/make/defs.make
index 5fe6b29..5e94726 100644
--- a/hotspot/make/defs.make
+++ b/hotspot/make/defs.make
@@ -228,6 +228,7 @@
 
 # Required make macro settings for all platforms
 MAKE_ARGS += JAVA_HOME=$(ABS_BOOTDIR)
+MAKE_ARGS += OUTPUTDIR=$(ABS_OUTPUTDIR)
 MAKE_ARGS += GAMMADIR=$(ABS_GAMMADIR)
 MAKE_ARGS += MAKE_VERBOSE=$(MAKE_VERBOSE)
 MAKE_ARGS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION)
diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version
index a31fa25..b30abbb 100644
--- a/hotspot/make/hotspot_version
+++ b/hotspot/make/hotspot_version
@@ -33,9 +33,9 @@
 # Don't put quotes (fail windows build).
 HOTSPOT_VM_COPYRIGHT=Copyright 2008
 
-HS_MAJOR_VER=13
+HS_MAJOR_VER=14
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=02
+HS_BUILD_NUMBER=01
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=7
diff --git a/hotspot/make/linux/Queens.class b/hotspot/make/linux/Queens.class
deleted file mode 100644
index d4582a0..0000000
--- a/hotspot/make/linux/Queens.class
+++ /dev/null
Binary files differ
diff --git a/hotspot/make/linux/makefiles/buildtree.make b/hotspot/make/linux/makefiles/buildtree.make
index 100544c..005ef37 100644
--- a/hotspot/make/linux/makefiles/buildtree.make
+++ b/hotspot/make/linux/makefiles/buildtree.make
@@ -328,18 +328,19 @@
 WRONG_DATA_MODE_MSG = \
 	echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
 
-test_gamma:  $(BUILDTREE_MAKE)
+test_gamma:  $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
 	@echo Creating $@ ...
 	$(QUIETLY) ( \
 	echo '#!/bin/sh'; \
 	$(BUILDTREE_COMMENT); \
 	echo '. ./env.sh'; \
 	echo "if [ -z \$$JAVA_HOME ]; then { $(NO_JAVA_HOME_MSG); exit 0; }; fi"; \
-	echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>1 > /dev/null"; \
+	echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>&1 > /dev/null"; \
 	echo "then"; \
 	echo "  $(WRONG_DATA_MODE_MSG); exit 0;"; \
 	echo "fi"; \
-	echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+	echo "rm -f Queens.class"; \
+	echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
 	echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
 	echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
 	) > $@
diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make
index 4134c1e..4a01c29 100644
--- a/hotspot/make/linux/makefiles/gcc.make
+++ b/hotspot/make/linux/makefiles/gcc.make
@@ -50,14 +50,7 @@
 
 VM_PICFLAG/LIBJVM = $(PICFLAG)
 VM_PICFLAG/AOUT   =
-
-ifneq ($(BUILDARCH), i486)
 VM_PICFLAG        = $(VM_PICFLAG/$(LINK_INTO))
-else
-# PIC has significant overhead on x86, build nonpic VM for now.
-# Link JVM at a "good" base location to avoid unnecessary .text patching.
-JVM_BASE_ADDR     = 0x06000000
-endif
 
 CFLAGS += $(VM_PICFLAG)
 CFLAGS += -fno-rtti
@@ -91,8 +84,17 @@
 
 # Compiler warnings are treated as errors
 WARNINGS_ARE_ERRORS = -Werror
+
 # Except for a few acceptable ones
+# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
+# conversions which might affect the values. To avoid that, we need to turn
+# it off explicitly. 
+ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ACCEPTABLE_WARNINGS = -Wpointer-arith -Wsign-compare
+else
 ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare
+endif
+
 CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS)
 # Special cases
 CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) 
diff --git a/hotspot/make/linux/makefiles/mapfile-vers-debug b/hotspot/make/linux/makefiles/mapfile-vers-debug
index 58fb822..63cce8b 100644
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug
@@ -89,6 +89,7 @@
                 JVM_FillInStackTrace;
                 JVM_FindClassFromClass;
                 JVM_FindClassFromClassLoader;
+                JVM_FindClassFromBootLoader;
                 JVM_FindLibraryEntry;
                 JVM_FindLoadedClass;
                 JVM_FindPrimitiveClass;
diff --git a/hotspot/make/linux/makefiles/mapfile-vers-product b/hotspot/make/linux/makefiles/mapfile-vers-product
index 544bbf9..6a76dd9 100644
--- a/hotspot/make/linux/makefiles/mapfile-vers-product
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product
@@ -89,6 +89,7 @@
                 JVM_FillInStackTrace;
                 JVM_FindClassFromClass;
                 JVM_FindClassFromClassLoader;
+                JVM_FindClassFromBootLoader;
                 JVM_FindLibraryEntry;
                 JVM_FindLoadedClass;
                 JVM_FindPrimitiveClass;
diff --git a/hotspot/make/linux/makefiles/rules.make b/hotspot/make/linux/makefiles/rules.make
index 691aca3..6559388 100644
--- a/hotspot/make/linux/makefiles/rules.make
+++ b/hotspot/make/linux/makefiles/rules.make
@@ -133,10 +133,25 @@
 COMPILE_DONE    = && { echo Done with $<; }
 endif
 
+# Include $(NONPIC_OBJ_FILES) definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
+
+# The non-PIC object files are only generated for 32 bit platforms.
+ifdef LP64
 %.o: %.cpp
 	@echo Compiling $<
 	$(QUIETLY) $(REMOVE_TARGET)
 	$(QUIETLY) $(COMPILE.CC) -o $@ $< $(COMPILE_DONE)
+else
+%.o: %.cpp
+	@echo Compiling $<
+	$(QUIETLY) $(REMOVE_TARGET)
+	$(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \
+	   $(subst $(VM_PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \
+	   $(COMPILE.CC) -o $@ $< $(COMPILE_DONE))
+endif
 
 %.o: %.s
 	@echo Assembling $<
diff --git a/hotspot/make/pic.make b/hotspot/make/pic.make
new file mode 100644
index 0000000..b20f77c
--- /dev/null
+++ b/hotspot/make/pic.make
@@ -0,0 +1,41 @@
+#
+# Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#  
+#
+
+# A list of object files built without the platform specific PIC flags, e.g.
+# -fPIC on linux. Performance measurements show that by compiling GC related 
+# code, we could significantly reduce the GC pause time on 32 bit Linux/Unix
+# platforms. See 6454213 for more details.
+include $(GAMMADIR)/make/scm.make
+
+ifneq ($(OSNAME), windows)
+  ifndef LP64
+    NONPIC_DIRS  = memory oops gc_implementation gc_interface 
+    NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
+    # Look for source files under NONPIC_DIRS
+    NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
+                      $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
+		      -name '*.cpp' -print))
+    NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+  endif
+endif
diff --git a/hotspot/make/solaris/Queens.class b/hotspot/make/solaris/Queens.class
deleted file mode 100644
index d4582a0..0000000
--- a/hotspot/make/solaris/Queens.class
+++ /dev/null
Binary files differ
diff --git a/hotspot/make/solaris/makefiles/buildtree.make b/hotspot/make/solaris/makefiles/buildtree.make
index 93e0776..47aced3 100644
--- a/hotspot/make/solaris/makefiles/buildtree.make
+++ b/hotspot/make/solaris/makefiles/buildtree.make
@@ -340,7 +340,7 @@
 WRONG_DATA_MODE_MSG = \
 	echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
 
-test_gamma:  $(BUILDTREE_MAKE)
+test_gamma:  $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
 	@echo Creating $@ ...
 	$(QUIETLY) ( \
 	echo '#!/bin/ksh'; \
@@ -351,7 +351,8 @@
 	echo "then"; \
 	echo "  $(WRONG_DATA_MODE_MSG); exit 0;"; \
 	echo "fi"; \
-	echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+	echo "rm -f Queens.class"; \
+	echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
 	echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
 	echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
 	) > $@
diff --git a/hotspot/make/solaris/makefiles/jvmg.make b/hotspot/make/solaris/makefiles/jvmg.make
index 02396f4..ada307a 100644
--- a/hotspot/make/solaris/makefiles/jvmg.make
+++ b/hotspot/make/solaris/makefiles/jvmg.make
@@ -30,7 +30,7 @@
 
 ifeq ("${Platform_compiler}", "sparcWorks")
 
-ifeq ($(COMPILER_REV),5.8))
+ifeq ($(COMPILER_REV),5.8)
   # SS11 SEGV when compiling with -g and -xarch=v8, using different backend
   DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0
   DEBUG_CFLAGS/jvmtiTagMap.o   = $(DEBUG_CFLAGS) -xO0
diff --git a/hotspot/make/solaris/makefiles/mapfile-vers b/hotspot/make/solaris/makefiles/mapfile-vers
index c0d9a9c..8c9d688 100644
--- a/hotspot/make/solaris/makefiles/mapfile-vers
+++ b/hotspot/make/solaris/makefiles/mapfile-vers
@@ -89,6 +89,7 @@
 		JVM_FillInStackTrace;
 		JVM_FindClassFromClass;
 		JVM_FindClassFromClassLoader;
+		JVM_FindClassFromBootLoader;
 		JVM_FindLibraryEntry;
 		JVM_FindLoadedClass;
 		JVM_FindPrimitiveClass;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486
index cee930f..bab5b28 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486
@@ -2175,6 +2175,7 @@
 text: .text%jni_GetStringUTFRegion: jni.o;
 text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%JVM_IsInterface;
 text: .text%JVM_GetClassDeclaredConstructors;
 text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc
index d135e73..0dc59ed 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc
@@ -1500,6 +1500,7 @@
 text: .text%jni_GetStringUTFRegion: jni.o;
 text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%JVM_IsInterface;
 text: .text%JVM_GetClassDeclaredConstructors;
 text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64
index b4bc7db..4531671 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64
@@ -4339,6 +4339,7 @@
 text: .text%__1cFParseLarray_store6MnJBasicType__v_;
 text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
 text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
 text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486
index 4113159..14a1fc2 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486
@@ -4755,6 +4755,7 @@
 text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
 text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
 text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc
index 4eadf37..26ef9b2 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc
@@ -3713,6 +3713,7 @@
 text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
 text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%signalHandler;
 text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
 text: .text%JVM_handle_solaris_signal;
diff --git a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9
index 3cc6b8b..5f4949f 100644
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9
@@ -3735,6 +3735,7 @@
 text: .text%__1cQjava_lang_ThreadRget_thread_status6FpnHoopDesc__n0AMThreadStatus__;
 text: .text%__1cIMulINodeGadd_id6kM_pknEType__: classes.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cHTypePtrFempty6kM_i_;
 text: .text%__1cQaddP_reg_regNodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cbFunnecessary_membar_volatileNodePoper_input_base6kM_I_: ad_sparc_misc.o;
diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64 b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64
index b4bc7db..4531671 100644
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64
@@ -4339,6 +4339,7 @@
 text: .text%__1cFParseLarray_store6MnJBasicType__v_;
 text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
 text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
 text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_i486 b/hotspot/make/solaris/makefiles/reorder_TIERED_i486
index 4113159..14a1fc2 100644
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_i486
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_i486
@@ -4755,6 +4755,7 @@
 text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
 text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
 text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
diff --git a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc
index 4eadf37..26ef9b2 100644
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc
@@ -3713,6 +3713,7 @@
 text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
 text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%signalHandler;
 text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
 text: .text%JVM_handle_solaris_signal;
diff --git a/hotspot/make/solaris/makefiles/rules.make b/hotspot/make/solaris/makefiles/rules.make
index 69b8b5c..56ff0e7 100644
--- a/hotspot/make/solaris/makefiles/rules.make
+++ b/hotspot/make/solaris/makefiles/rules.make
@@ -133,19 +133,10 @@
 COMPILE_DONE    = && { echo Done with $<; }
 endif
 
-# A list of directories under which all source code are built without -KPIC/-Kpic
-# flag. Performance measurements show that compiling GC related code will
-# dramatically reduce the gc pause time. See bug 6454213 for more details.
-
-include $(GAMMADIR)/make/scm.make
-
-NONPIC_DIRS  = memory oops gc_implementation gc_interface 
-NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
-# Look for source code under NONPIC_DIRS
-NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
-                 $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
-		  -name '*.cpp' -print))
-NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+# Include NONPIC_OBJ_FILES definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
 
 # Sun compiler for 64 bit Solaris does not support building non-PIC object files.
 ifdef LP64
diff --git a/hotspot/make/windows/makefiles/vm.make b/hotspot/make/windows/makefiles/vm.make
index a8a5fb4..e7321de 100644
--- a/hotspot/make/windows/makefiles/vm.make
+++ b/hotspot/make/windows/makefiles/vm.make
@@ -88,13 +88,20 @@
 !endif
 !endif
 
-LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000  \
-  /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM    \
-  /export:JNI_GetCreatedJavaVMs /export:jio_snprintf               \
-  /export:jio_printf /export:jio_fprintf                           \
-  /export:jio_vfprintf /export:jio_vsnprintf $(AGCT_EXPORT)        \
-  /export:JVM_GetVersionInfo \
-  /export:JVM_GetThreadStateNames /export:JVM_GetThreadStateValues \
+LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
+  /export:JNI_GetDefaultJavaVMInitArgs       \
+  /export:JNI_CreateJavaVM                   \
+  /export:JVM_FindClassFromBootLoader        \
+  /export:JNI_GetCreatedJavaVMs              \
+  /export:jio_snprintf                       \
+  /export:jio_printf                         \
+  /export:jio_fprintf                        \
+  /export:jio_vfprintf                       \
+  /export:jio_vsnprintf                      \
+  $(AGCT_EXPORT)                             \
+  /export:JVM_GetVersionInfo                 \
+  /export:JVM_GetThreadStateNames            \
+  /export:JVM_GetThreadStateValues           \
   /export:JVM_InitAgentProperties
 
 CPP_INCLUDE_DIRS=\
diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad
index c86d29e..c02673b 100644
--- a/hotspot/src/cpu/sparc/vm/sparc.ad
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad
@@ -5955,7 +5955,7 @@
 
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(iRegN dst, iRegP src) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
   match(Set dst (EncodeP src));
   format %{ "encode_heap_oop $src, $dst" %}
   ins_encode %{
@@ -5965,7 +5965,7 @@
 %}
 
 instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
   match(Set dst (EncodeP src));
   format %{ "encode_heap_oop_not_null $src, $dst" %}
   ins_encode %{
diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp
index 26c50ce..d65cc0c 100644
--- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp
@@ -307,6 +307,10 @@
       // Use it on new AMD cpus starting from Opteron.
       UseAddressNop = true;
     }
+    if( supports_sse2() && FLAG_IS_DEFAULT(UseNewLongLShift) ) {
+      // Use it on new AMD cpus starting from Opteron.
+      UseNewLongLShift = true;
+    }
     if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
       if( supports_sse4a() ) {
         UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron
diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad
index 9eae730..35db833 100644
--- a/hotspot/src/cpu/x86/vm/x86_32.ad
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad
@@ -4754,6 +4754,33 @@
   interface(CONST_INTER);
 %}
 
+operand immI_1() %{
+  predicate( n->get_int() == 1 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+operand immI_2() %{
+  predicate( n->get_int() == 2 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+operand immI_3() %{
+  predicate( n->get_int() == 3 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // Pointer Immediate
 operand immP() %{
   match(ConP);
@@ -8943,6 +8970,63 @@
   ins_pipe( ialu_reg_long_mem );
 %}
 
+// Shift Left Long by 1
+instruct shlL_eReg_1(eRegL dst, immI_1 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 2
+instruct shlL_eReg_2(eRegL dst, immI_2 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 3
+instruct shlL_eReg_3(eRegL dst, immI_3 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
 // Shift Left Long by 1-31
 instruct shlL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
   match(Set dst (LShiftL dst cnt));
diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad
index f9e8e89..3029941 100644
--- a/hotspot/src/cpu/x86/vm/x86_64.ad
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad
@@ -7060,7 +7060,7 @@
 
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
   match(Set dst (EncodeP src));
   effect(KILL cr);
   format %{ "encode_heap_oop $dst,$src" %}
@@ -7076,7 +7076,7 @@
 %}
 
 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
   match(Set dst (EncodeP src));
   effect(KILL cr);
   format %{ "encode_heap_oop_not_null $dst,$src" %}
diff --git a/hotspot/src/os/linux/vm/hpi_linux.hpp b/hotspot/src/os/linux/vm/hpi_linux.hpp
index d14ca94..b671a4e 100644
--- a/hotspot/src/os/linux/vm/hpi_linux.hpp
+++ b/hotspot/src/os/linux/vm/hpi_linux.hpp
@@ -70,6 +70,10 @@
   RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, (unsigned int) flags));
 }
 
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  return send(fd, buf, nBytes, flags);
+}
+
 inline int hpi::timeout(int fd, long timeout) {
   julong prevtime,newtime;
   struct timeval t;
diff --git a/hotspot/src/os/linux/vm/jvm_linux.cpp b/hotspot/src/os/linux/vm/jvm_linux.cpp
index dc4d285..b38ff5c 100644
--- a/hotspot/src/os/linux/vm/jvm_linux.cpp
+++ b/hotspot/src/os/linux/vm/jvm_linux.cpp
@@ -132,7 +132,7 @@
 */
 
 struct siglabel {
-  char *name;
+  const char *name;
   int   number;
 };
 
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 84322f3..4c7ab6f 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -75,8 +75,8 @@
 bool os::Linux::_is_floating_stack = false;
 bool os::Linux::_is_NPTL = false;
 bool os::Linux::_supports_fast_thread_cpu_time = false;
-char * os::Linux::_glibc_version = NULL;
-char * os::Linux::_libpthread_version = NULL;
+const char * os::Linux::_glibc_version = NULL;
+const char * os::Linux::_libpthread_version = NULL;
 
 static jlong initial_time_count=0;
 
@@ -213,9 +213,9 @@
 // the system call returns 1.  This causes the VM to act as if it is
 // a single processor and elide locking (see is_MP() call).
 static bool unsafe_chroot_detected = false;
-static char *unstable_chroot_error = "/proc file system not found.\n"
-              "Java may be unstable running multithreaded in a chroot "
-              "environment on Linux when /proc filesystem is not mounted.";
+static const char *unstable_chroot_error = "/proc file system not found.\n"
+                     "Java may be unstable running multithreaded in a chroot "
+                     "environment on Linux when /proc filesystem is not mounted.";
 
 void os::Linux::initialize_system_info() {
   _processor_count = sysconf(_SC_NPROCESSORS_CONF);
@@ -544,26 +544,23 @@
   if (n > 0) {
      char *str = (char *)malloc(n);
      confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n);
-
      // Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells
      // us "NPTL-0.29" even we are running with LinuxThreads. Check if this
-     // is the case:
+     // is the case. LinuxThreads has a hard limit on max number of threads.
+     // So sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
+     // On the other hand, NPTL does not have such a limit, sysconf()
+     // will return -1 and errno is not changed. Check if it is really NPTL.
      if (strcmp(os::Linux::glibc_version(), "glibc 2.3.2") == 0 &&
-         strstr(str, "NPTL")) {
-        // LinuxThreads has a hard limit on max number of threads. So
-        // sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
-        // On the other hand, NPTL does not have such a limit, sysconf()
-        // will return -1 and errno is not changed. Check if it is really
-        // NPTL:
-        if (sysconf(_SC_THREAD_THREADS_MAX) > 0) {
-           free(str);
-           str = "linuxthreads";
-        }
+         strstr(str, "NPTL") &&
+         sysconf(_SC_THREAD_THREADS_MAX) > 0) {
+       free(str);
+       os::Linux::set_libpthread_version("linuxthreads");
+     } else {
+       os::Linux::set_libpthread_version(str);
      }
-     os::Linux::set_libpthread_version(str);
   } else {
-     // glibc before 2.3.2 only has LinuxThreads.
-     os::Linux::set_libpthread_version("linuxthreads");
+    // glibc before 2.3.2 only has LinuxThreads.
+    os::Linux::set_libpthread_version("linuxthreads");
   }
 
   if (strstr(libpthread_version(), "NPTL")) {
@@ -4632,11 +4629,7 @@
 // Unlike system(), this function can be called from signal handler. It
 // doesn't block SIGINT et al.
 int os::fork_and_exec(char* cmd) {
-  char * argv[4];
-  argv[0] = "sh";
-  argv[1] = "-c";
-  argv[2] = cmd;
-  argv[3] = NULL;
+  const char * argv[4] = {"sh", "-c", cmd, NULL};
 
   // fork() in LinuxThreads/NPTL is not async-safe. It needs to run
   // pthread_atfork handlers and reset pthread library. All we need is a
@@ -4661,7 +4654,7 @@
     // IA64 should use normal execve() from glibc to match the glibc fork()
     // above.
     NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
-    IA64_ONLY(execve("/bin/sh", argv, environ);)
+    IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
 
     // execve failed
     _exit(-1);
diff --git a/hotspot/src/os/linux/vm/os_linux.hpp b/hotspot/src/os/linux/vm/os_linux.hpp
index 367a1a7..baa4125 100644
--- a/hotspot/src/os/linux/vm/os_linux.hpp
+++ b/hotspot/src/os/linux/vm/os_linux.hpp
@@ -52,8 +52,8 @@
   static address   _initial_thread_stack_bottom;
   static uintptr_t _initial_thread_stack_size;
 
-  static char *_glibc_version;
-  static char *_libpthread_version;
+  static const char *_glibc_version;
+  static const char *_libpthread_version;
 
   static bool _is_floating_stack;
   static bool _is_NPTL;
@@ -72,8 +72,8 @@
   static julong physical_memory() { return _physical_memory; }
   static void initialize_system_info();
 
-  static void set_glibc_version(char *s)      { _glibc_version = s; }
-  static void set_libpthread_version(char *s) { _libpthread_version = s; }
+  static void set_glibc_version(const char *s)      { _glibc_version = s; }
+  static void set_libpthread_version(const char *s) { _libpthread_version = s; }
 
   static bool supports_variable_stack_size();
 
@@ -134,8 +134,8 @@
   static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
 
   // GNU libc and libpthread version strings
-  static char *glibc_version()                { return _glibc_version; }
-  static char *libpthread_version()           { return _libpthread_version; }
+  static const char *glibc_version()          { return _glibc_version; }
+  static const char *libpthread_version()     { return _libpthread_version; }
 
   // NPTL or LinuxThreads?
   static bool is_LinuxThreads()               { return !_is_NPTL; }
diff --git a/hotspot/src/os/solaris/vm/hpi_solaris.hpp b/hotspot/src/os/solaris/vm/hpi_solaris.hpp
index cd5f2ea..8164a8e 100644
--- a/hotspot/src/os/solaris/vm/hpi_solaris.hpp
+++ b/hotspot/src/os/solaris/vm/hpi_solaris.hpp
@@ -71,6 +71,10 @@
   INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
 }
 
+inline int    hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
+}
+
 // As both poll and select can be interrupted by signals, we have to be
 // prepared to restart the system call after updating the timeout, unless
 // a poll() is done with timeout == -1, in which case we repeat with this
diff --git a/hotspot/src/os/windows/vm/hpi_windows.hpp b/hotspot/src/os/windows/vm/hpi_windows.hpp
index 1398950..663654f 100644
--- a/hotspot/src/os/windows/vm/hpi_windows.hpp
+++ b/hotspot/src/os/windows/vm/hpi_windows.hpp
@@ -102,6 +102,10 @@
          fd, buf, nBytes, flags),
         (fd, buf, nBytes, flags));
 
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  return send(fd, buf, nBytes, flags);
+}
+
 HPIDECL(timeout, "timeout", _socket, Timeout, int, "%d",
         (int fd, long timeout),
         ("fd = %d, timeout = %ld", fd, timeout),
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml
new file mode 100644
index 0000000..2c8642c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.svg" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.svg.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf
new file mode 100644
index 0000000..689e17a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.svg

+OpenIDE-Module-Layer: com/sun/hotspot/igv/svg/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/svg/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml
new file mode 100644
index 0000000..5fe569e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.svg-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties
new file mode 100644
index 0000000..5018df1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=ebcf0422
+build.xml.script.CRC32=d7a2678d
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=ebcf0422
+nbproject/build-impl.xml.script.CRC32=57997f94
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml
new file mode 100644
index 0000000..3939a84
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.svg</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java
new file mode 100644
index 0000000..8326ff1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.svg;
+
+import java.awt.Graphics2D;
+import java.io.Writer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import org.w3c.dom.DOMImplementation;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BatikSVG {
+
+    private static Constructor SVGGraphics2DConstructor;
+    private static Method Method_stream;
+    private static Method Method_createDefault;
+    private static Method Method_getDOMImplementation;
+    private static Method Method_setEmbeddedFontsOn;
+
+    public static Graphics2D createGraphicsObject() {
+        try {
+            if (SVGGraphics2DConstructor == null) {
+                ClassLoader cl = BatikSVG.class.getClassLoader();
+                Class Class_GenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation");
+                Class Class_SVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext");
+                Class Class_SVGGraphics2D = cl.loadClass("org.apache.batik.svggen.SVGGraphics2D");
+                Method_getDOMImplementation = Class_GenericDOMImplementation.getDeclaredMethod("getDOMImplementation", new Class[0]);
+                Method_createDefault = Class_SVGGeneratorContext.getDeclaredMethod("createDefault", new Class[]{org.w3c.dom.Document.class});
+                Method_setEmbeddedFontsOn = Class_SVGGeneratorContext.getDeclaredMethod("setEmbeddedFontsOn", new Class[]{boolean.class});
+                Method_stream = Class_SVGGraphics2D.getDeclaredMethod("stream", Writer.class, boolean.class);
+                SVGGraphics2DConstructor = Class_SVGGraphics2D.getConstructor(Class_SVGGeneratorContext, boolean.class);
+            }
+            DOMImplementation dom = (DOMImplementation) Method_getDOMImplementation.invoke(null);
+            org.w3c.dom.Document document = dom.createDocument("http://www.w3.org/2000/svg", "svg", null);
+            Object ctx = Method_createDefault.invoke(null, document);
+            Method_setEmbeddedFontsOn.invoke(ctx, true);
+            Graphics2D svgGenerator = (Graphics2D) SVGGraphics2DConstructor.newInstance(ctx, true);
+            return svgGenerator;
+        } catch (ClassNotFoundException e) {
+            return null;
+        } catch (NoSuchMethodException e) {
+            return null;
+        } catch (IllegalAccessException e) {
+            return null;
+        } catch (InvocationTargetException e) {
+            return null;
+        } catch (InstantiationException e) {
+            return null;
+        }
+    }
+
+    public static void printToStream(Graphics2D svgGenerator, Writer stream, boolean useCSS) {
+        try {
+            Method_stream.invoke(svgGenerator, stream, useCSS);
+        } catch (IllegalAccessException e) {
+            assert false;
+        } catch (InvocationTargetException e) {
+            assert false;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties
new file mode 100644
index 0000000..e579912
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=BatikSVGProxy
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml
new file mode 100644
index 0000000..c16a8a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml
new file mode 100644
index 0000000..1466d86
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.bytecodes" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.bytecodes.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf
new file mode 100644
index 0000000..a04660a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.bytecodes

+OpenIDE-Module-Layer: com/sun/hotspot/igv/bytecodes/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/bytecodes/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml
new file mode 100644
index 0000000..4991499
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.bytecodes-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties
new file mode 100644
index 0000000..a60cd07
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1dee290d
+build.xml.script.CRC32=d594034f
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1dee290d
+nbproject/build-impl.xml.script.CRC32=b4dab126
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml
new file mode 100644
index 0000000..91bd812
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.bytecodes</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties
new file mode 100644
index 0000000..cd6852f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties
@@ -0,0 +1,5 @@
+CTL_BytecodeViewAction=Open BytecodeView Window
+CTL_BytecodeViewTopComponent=BytecodeView Window
+CTL_SelectBytecodesAction=Select nodes
+HINT_BytecodeViewTopComponent=This is a BytecodeView window
+OpenIDE-Module-Name=Bytecodes
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java
new file mode 100644
index 0000000..f9d1aa0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.StringPropertyMatcher;
+import java.awt.Image;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeNode extends AbstractNode {
+
+    private Set<InputNode> nodes;
+
+    public BytecodeNode(InputBytecode bytecode, InputGraph graph, String bciValue) {
+
+        super(Children.LEAF);
+        this.setDisplayName(bytecode.getBci() + " " + bytecode.getName());
+
+        bciValue = bytecode.getBci() + " " + bciValue;
+        bciValue = bciValue.trim();
+
+        Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(graph.getNodes());
+        StringPropertyMatcher matcher = new StringPropertyMatcher("bci", bciValue);
+        List<InputNode> nodeList = selector.selectMultiple(matcher);
+        if (nodeList.size() > 0) {
+            nodes = new HashSet<InputNode>();
+            for (InputNode n : nodeList) {
+                nodes.add(n);
+            }
+            this.setDisplayName(this.getDisplayName() + " (" + nodes.size() + " nodes)");
+        }
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        if (nodes != null) {
+            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif");
+        } else {
+            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif");
+        }
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return (Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true);
+    }
+
+    @Override
+    public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+        if (aClass == SelectBytecodesCookie.class && nodes != null) {
+            return (T) (new SelectBytecodesCookie(nodes));
+        }
+        return super.getCookie(aClass);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java
new file mode 100644
index 0000000..df7b398
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeViewAction extends AbstractAction {
+
+    public BytecodeViewAction() {
+        super(NbBundle.getMessage(BytecodeViewAction.class, "CTL_BytecodeViewAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = BytecodeViewTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form
new file mode 100644
index 0000000..c2549ec
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java
new file mode 100644
index 0000000..6fbbe90
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import org.openide.ErrorManager;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+final class BytecodeViewTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+    private static BytecodeViewTopComponent instance;
+    private static final String PREFERRED_ID = "BytecodeViewTopComponent";
+    private ExplorerManager manager;
+    private BeanTreeView treeView;
+    private Lookup.Result result = null;
+    private MethodNode rootNode;
+
+    private BytecodeViewTopComponent() {
+        initComponents();
+        setName(NbBundle.getMessage(BytecodeViewTopComponent.class, "CTL_BytecodeViewTopComponent"));
+        setToolTipText(NbBundle.getMessage(BytecodeViewTopComponent.class, "HINT_BytecodeViewTopComponent"));
+
+        manager = new ExplorerManager();
+        rootNode = new MethodNode(null, null, "");
+        manager.setRootContext(rootNode);
+
+        setLayout(new BorderLayout());
+
+        treeView = new BeanTreeView();
+        treeView.setRootVisible(false);
+        this.add(BorderLayout.CENTER, treeView);
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized BytecodeViewTopComponent getDefault() {
+        if (instance == null) {
+            instance = new BytecodeViewTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the BytecodeViewTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized BytecodeViewTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find BytecodeView component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof BytecodeViewTopComponent) {
+            return (BytecodeViewTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template tpl = new Lookup.Template(Object.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    @Override
+    public Object writeReplace() {
+        return new ResolvableHelper();
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            InputGraph graph = p.getGraph();
+            if (graph != null) {
+                Group g = graph.getGroup();
+                rootNode.update(graph, g.getMethod());
+            }
+        }
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return BytecodeViewTopComponent.getDefault();
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml
new file mode 100644
index 0000000..d9469ab
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent"/>
+    <instance class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent" method="getDefault"/>
+</settings>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml
new file mode 100644
index 0000000..a680c8f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+    <tc-id id="BytecodeViewTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java
new file mode 100644
index 0000000..b8f777e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import java.awt.Image;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MethodNode extends AbstractNode {
+
+    private static class MethodNodeChildren extends Children.Keys {
+
+        private InputMethod method;
+        private InputGraph graph;
+        private String bciString;
+
+        public MethodNodeChildren(InputMethod method, InputGraph graph, String bciString) {
+            this.method = method;
+            this.bciString = bciString;
+            this.graph = graph;
+        }
+
+        protected Node[] createNodes(Object object) {
+            assert object instanceof InputBytecode;
+            InputBytecode bc = (InputBytecode) object;
+            if (bc.getInlined() == null) {
+                return new Node[]{new BytecodeNode(bc, graph, bciString)};
+            } else {
+                return new Node[]{new BytecodeNode(bc, graph, bciString), new MethodNode(bc.getInlined(), graph, bc.getBci() + " " + bciString)};
+            }
+        }
+
+        @Override
+        public void addNotify() {
+            if (method != null) {
+                setKeys(method.getBytecodes());
+            }
+        }
+
+        public void setMethod(InputMethod method, InputGraph graph) {
+            this.method = method;
+            this.graph = graph;
+            addNotify();
+        }
+    }
+
+    /** Creates a new instance of MethodNode */
+    public MethodNode(InputMethod method, InputGraph graph, String bciString) {
+        super((method != null && method.getBytecodes().size() == 0) ? Children.LEAF : new MethodNodeChildren(method, graph, bciString));
+        if (method != null) {
+            this.setDisplayName(method.getName());
+        }
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif");
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    public void update(InputGraph graph, InputMethod method) {
+        ((MethodNodeChildren) this.getChildren()).setMethod(method, graph);
+        if (method != null) {
+            this.setDisplayName(method.getName());
+        }
+
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java
new file mode 100644
index 0000000..317e3a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SelectBytecodesAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        SelectBytecodesCookie c = activatedNodes[0].getCookie(SelectBytecodesCookie.class);
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            p.setSelectedNodes(c.getNodes());
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SelectBytecodesAction.class, "CTL_SelectBytecodesAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            SelectBytecodesCookie.class
+        };
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java
new file mode 100644
index 0000000..ff48bbb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Collections;
+import java.util.Set;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SelectBytecodesCookie implements Node.Cookie {
+
+    private Set<InputNode> nodes;
+
+    /** Creates a new instance of SelectBytecodesCookie */
+    public SelectBytecodesCookie(Set<InputNode> nodes) {
+        this.nodes = nodes;
+    }
+
+    public Set<InputNode> getNodes() {
+        return Collections.unmodifiableSet(nodes);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif
new file mode 100644
index 0000000..5a2a355
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif
new file mode 100644
index 0000000..fc6595b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif
new file mode 100644
index 0000000..dc90fd0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml
new file mode 100644
index 0000000..de53ae1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="Edit">
+            <file name="com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance"/>
+        </folder>
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="BytecodeViewAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="BytecodeViewTopComponent.settings" url="BytecodeViewTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <folder name="customRightTopMode">
+                <file name="BytecodeViewTopComponent.wstcref" url="BytecodeViewTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml
new file mode 100644
index 0000000..b90d3b8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.controlflow" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.controlflow.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf
new file mode 100644
index 0000000..3ed1906
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.controlflow

+OpenIDE-Module-Layer: com/sun/hotspot/igv/controlflow/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/controlflow/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml
new file mode 100644
index 0000000..1664c75
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.controlflow-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties
new file mode 100644
index 0000000..ba61dc5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b524efb3
+build.xml.script.CRC32=79a27be9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b524efb3
+nbproject/build-impl.xml.script.CRC32=582bdab7
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml
new file mode 100644
index 0000000..212cf23
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.controlflow</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java
new file mode 100644
index 0000000..d1e9b9b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockConnectionWidget extends ConnectionWidget implements Link {
+
+    private BlockWidget from;
+    private BlockWidget to;
+    private Port inputSlot;
+    private Port outputSlot;
+    private List<Point> points;
+    private InputBlockEdge edge;
+
+    public BlockConnectionWidget(ControlFlowScene scene, InputBlockEdge edge) {
+        super(scene);
+
+        this.edge = edge;
+        this.from = (BlockWidget) scene.findWidget(edge.getFrom());
+        this.to = (BlockWidget) scene.findWidget(edge.getTo());
+        inputSlot = to.getInputSlot();
+        outputSlot = from.getOutputSlot();
+        points = new ArrayList<Point>();
+    }
+
+    public InputBlockEdge getEdge() {
+        return edge;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.points = p;
+    }
+
+    @Override
+    public List<Point> getControlPoints() {
+        return points;
+    }
+
+    @Override
+    public String toString() {
+        return "Connection[ " + from.toString() + " - " + to.toString() + "]";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java
new file mode 100644
index 0000000..c56e93e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import org.netbeans.api.visual.border.BorderFactory;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.LabelWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends LabelWidget implements Vertex {
+
+    public static final Dimension SIZE = new Dimension(20, 20);
+    private InputBlock block;
+    private Port inputSlot;
+    private Port outputSlot;
+    private Cluster cluster;
+    private boolean root;
+    private static final Font font = new Font(Font.SERIF, Font.PLAIN, 12);
+    private static final Font boldFont = font.deriveFont(Font.BOLD);
+    public static final Color NORMAL_FOREGROUND_COLOR = Color.BLACK;
+    public static final Color HOVER_FOREGROUND_COLOR = Color.BLUE;
+
+    /** Creates a new instance of BlockWidget */
+    public BlockWidget(ControlFlowScene scene, InputBlock block) {
+        super(scene);
+        this.block = block;
+        this.setLabel(block.getName());
+        this.setForeground(NORMAL_FOREGROUND_COLOR);
+        this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+        this.setMinimumSize(SIZE);
+        this.setMaximumSize(SIZE);
+
+        this.setFont(font);
+
+        final BlockWidget widget = this;
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public InputBlock getBlock() {
+        return block;
+    }
+
+    public Dimension getSize() {
+        return SIZE;
+    }
+
+    public void setPosition(Point p) {
+        this.setPreferredLocation(p);
+    }
+
+    @Override
+    public String toString() {
+        return block.getName();
+    }
+
+    public Point getPosition() {
+        return this.getPreferredLocation();
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        super.notifyStateChanged(previousState, state);
+
+        if (previousState.isHovered() != state.isHovered()) {
+            if (state.isHovered()) {
+                this.setBorder(BorderFactory.createLineBorder(1, HOVER_FOREGROUND_COLOR));
+            } else {
+                this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+            }
+        }
+
+        if (previousState.isSelected() != state.isSelected()) {
+            if (state.isSelected()) {
+                this.setFont(boldFont);
+            } else {
+                this.setFont(font);
+            }
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties
new file mode 100644
index 0000000..31865f1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties
@@ -0,0 +1,4 @@
+CTL_ControlFlowAction=Open ControlFlow Window
+CTL_ControlFlowTopComponent=ControlFlow Window
+HINT_ControlFlowTopComponent=This is a ControlFlow window
+OpenIDE-Module-Name=ControlFlow
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java
new file mode 100644
index 0000000..bafde10
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowAction extends AbstractAction {
+
+    public ControlFlowAction() {
+        super(NbBundle.getMessage(ControlFlowAction.class, "CTL_ControlFlowAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = ControlFlowTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java
new file mode 100644
index 0000000..8b794b1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.awt.Color;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import javax.swing.BorderFactory;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.MoveProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.anchor.AnchorFactory;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import com.sun.hotspot.igv.controlflow.HierarchicalGraphLayout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.router.RouterFactory;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.graph.GraphScene;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.layout.SceneLayout;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowScene extends GraphScene<InputBlock, InputBlockEdge> implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider {
+
+    private Set<BlockWidget> selection;
+    private Hashtable<InputBlock, BlockWidget> blockMap;
+    private InputGraph oldGraph;
+    private LayerWidget edgeLayer;
+    private LayerWidget mainLayer;
+    private LayerWidget selectLayer;
+    private WidgetAction hoverAction = this.createWidgetHoverAction();
+    private WidgetAction selectAction = ActionFactory.createSelectAction(this);
+    private WidgetAction moveAction = ActionFactory.createMoveAction(null, this);
+
+    public ControlFlowScene() {
+        selection = new HashSet<BlockWidget>();
+
+        this.getInputBindings().setZoomActionModifiers(0);
+        this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+        mainLayer = new LayerWidget(this);
+        this.addChild(mainLayer);
+
+        edgeLayer = new LayerWidget(this);
+        this.addChild(edgeLayer);
+
+        selectLayer = new LayerWidget(this);
+        this.addChild(selectLayer);
+
+        this.getActions().addAction(hoverAction);
+        this.getActions().addAction(selectAction);
+        this.getActions().addAction(ActionFactory.createRectangularSelectAction(this, selectLayer, this));
+        this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+    }
+
+    public void setGraph(InputGraph g) {
+        if (g == oldGraph) {
+            return;
+        }
+        oldGraph = g;
+
+        ArrayList<InputBlock> blocks = new ArrayList<InputBlock>(this.getNodes());
+        for (InputBlock b : blocks) {
+            removeNode(b);
+        }
+
+        ArrayList<InputBlockEdge> edges = new ArrayList<InputBlockEdge>(this.getEdges());
+        for (InputBlockEdge e : edges) {
+            removeEdge(e);
+        }
+
+        for (InputBlock b : g.getBlocks()) {
+            addNode(b);
+        }
+
+        for (InputBlock b : g.getBlocks()) {
+            for (InputBlockEdge e : b.getOutputs()) {
+                addEdge(e);
+                assert g.getBlocks().contains(e.getFrom());
+                assert g.getBlocks().contains(e.getTo());
+                this.setEdgeSource(e, e.getFrom());
+                this.setEdgeTarget(e, e.getTo());
+            }
+        }
+
+        GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout();
+        SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout);
+        sceneLayout.invokeLayout();
+
+        this.validate();
+    }
+
+    public BlockWidget getBlockWidget(InputBlock b) {
+        return blockMap.get(b);
+    }
+
+    public void clearSelection() {
+        for (BlockWidget w : selection) {
+            w.setState(w.getState().deriveSelected(false));
+        }
+        selection.clear();
+        selectionChanged();
+    }
+
+    public void selectionChanged() {
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            Set<InputNode> inputNodes = new HashSet<InputNode>();
+            for (BlockWidget w : selection) {
+                inputNodes.addAll(w.getBlock().getNodes());
+            }
+            p.setSelectedNodes(inputNodes);
+        }
+    }
+
+    public void addToSelection(BlockWidget widget) {
+        widget.setState(widget.getState().deriveSelected(true));
+        selection.add(widget);
+        selectionChanged();
+    }
+
+    public void removeFromSelection(BlockWidget widget) {
+        widget.setState(widget.getState().deriveSelected(false));
+        selection.remove(widget);
+        selectionChanged();
+    }
+
+    public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+        return false;
+    }
+
+    public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+        return true;
+    }
+
+    public void select(Widget widget, Point point, boolean change) {
+        if (widget == this) {
+            clearSelection();
+        } else {
+
+            assert widget instanceof BlockWidget;
+            BlockWidget bw = (BlockWidget) widget;
+            if (change) {
+                if (selection.contains(bw)) {
+                    removeFromSelection(bw);
+                } else {
+                    addToSelection(bw);
+                }
+            } else {
+                if (!selection.contains(bw)) {
+                    clearSelection();
+                    addToSelection(bw);
+                }
+            }
+        }
+    }
+
+    public void movementStarted(Widget widget) {
+    }
+
+    public void movementFinished(Widget widget) {
+    }
+
+    public Point getOriginalLocation(Widget widget) {
+        return widget.getPreferredLocation();
+    }
+
+    public void setNewLocation(Widget widget, Point location) {
+        Point originalLocation = getOriginalLocation(widget);
+        int xOffset = location.x - originalLocation.x;
+        int yOffset = location.y - originalLocation.y;
+        for (Widget w : this.selection) {
+            Point p = new Point(w.getPreferredLocation());
+            p.translate(xOffset, yOffset);
+            w.setPreferredLocation(p);
+        }
+
+    }
+
+    public Widget createSelectionWidget() {
+        Widget widget = new Widget(this);
+        widget.setOpaque(false);
+        widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+        widget.setForeground(Color.red);
+        return widget;
+    }
+
+    public void performSelection(Rectangle rectangle) {
+
+        if (rectangle.width < 0) {
+            rectangle.x += rectangle.width;
+            rectangle.width *= -1;
+        }
+
+        if (rectangle.height < 0) {
+            rectangle.y += rectangle.height;
+            rectangle.height *= -1;
+        }
+
+        boolean changed = false;
+        for (InputBlock b : this.getNodes()) {
+            BlockWidget w = (BlockWidget) findWidget(b);
+            Rectangle r = new Rectangle(w.getBounds());
+            r.setLocation(w.getLocation());
+            if (r.intersects(rectangle)) {
+                if (!selection.contains(w)) {
+                    changed = true;
+                    selection.add(w);
+                    w.setState(w.getState().deriveSelected(true));
+                }
+            } else {
+                if (selection.contains(w)) {
+                    changed = true;
+                    selection.remove(w);
+                    w.setState(w.getState().deriveSelected(false));
+                }
+            }
+        }
+
+        if (changed) {
+            selectionChanged();
+        }
+
+    }
+
+    protected Widget attachNodeWidget(InputBlock node) {
+        BlockWidget w = new BlockWidget(this, node);
+        mainLayer.addChild(w);
+        w.getActions().addAction(hoverAction);
+        w.getActions().addAction(selectAction);
+        w.getActions().addAction(moveAction);
+        return w;
+    }
+
+    protected Widget attachEdgeWidget(InputBlockEdge edge) {
+        ConnectionWidget w = new BlockConnectionWidget(this, edge);
+        w.setRouter(RouterFactory.createDirectRouter());
+        w.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
+        edgeLayer.addChild(w);
+        return w;
+    }
+
+    protected void attachEdgeSourceAnchor(InputBlockEdge edge, InputBlock oldSourceNode, InputBlock sourceNode) {
+        Widget w = this.findWidget(edge);
+        assert w instanceof ConnectionWidget;
+        ConnectionWidget cw = (ConnectionWidget) w;
+        cw.setSourceAnchor(AnchorFactory.createRectangularAnchor(findWidget(sourceNode)));
+
+    }
+
+    protected void attachEdgeTargetAnchor(InputBlockEdge edge, InputBlock oldTargetNode, InputBlock targetNode) {
+        Widget w = this.findWidget(edge);
+        assert w instanceof ConnectionWidget;
+        ConnectionWidget cw = (ConnectionWidget) w;
+        cw.setTargetAnchor(AnchorFactory.createRectangularAnchor(findWidget(targetNode)));
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form
new file mode 100644
index 0000000..c2549ec
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java
new file mode 100644
index 0000000..968cdd5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import javax.swing.JScrollPane;
+import org.openide.ErrorManager;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ControlFlowTopComponent extends TopComponent implements LookupListener {
+
+    private static ControlFlowTopComponent instance;
+    private Lookup.Result result = null;
+    private static final String PREFERRED_ID = "ControlFlowTopComponent";
+    private ControlFlowScene scene;
+
+    private ControlFlowTopComponent() {
+        initComponents();
+        setName(NbBundle.getMessage(ControlFlowTopComponent.class, "CTL_ControlFlowTopComponent"));
+        setToolTipText(NbBundle.getMessage(ControlFlowTopComponent.class, "HINT_ControlFlowTopComponent"));
+
+        scene = new ControlFlowScene();
+        this.setLayout(new BorderLayout());
+        this.associateLookup(scene.getLookup());
+
+
+        JScrollPane panel = new JScrollPane(scene.createView());
+        this.add(panel, BorderLayout.CENTER);
+    }
+
+    @Override
+    public void requestFocus() {
+        super.requestFocus();
+        scene.getView().requestFocus();
+    }
+
+    @Override
+    public boolean requestFocusInWindow() {
+        super.requestFocusInWindow();
+        return scene.getView().requestFocusInWindow();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized ControlFlowTopComponent getDefault() {
+        if (instance == null) {
+            instance = new ControlFlowTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the ControlFlowTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized ControlFlowTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find ControlFlow component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof ControlFlowTopComponent) {
+            return (ControlFlowTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template tpl = new Lookup.Template(Object.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            InputGraph g = p.getGraph();
+            if (g != null) {
+                scene.setGraph(g);
+            }
+        }
+    }
+
+    @Override
+    public Object writeReplace() {
+        return new ResolvableHelper();
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    @Override
+    public void requestActive() {
+        scene.getView().requestFocusInWindow();
+        super.requestActive();
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return ControlFlowTopComponent.getDefault();
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml
new file mode 100644
index 0000000..e226cd5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent"/>
+    <instance class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent" method="getDefault"/>
+</settings>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml
new file mode 100644
index 0000000..07bbb1f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+    <tc-id id="ControlFlowTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java
new file mode 100644
index 0000000..2a0c9ee
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.graph.layout.UniversalGraph;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalGraphLayout<N, E> extends GraphLayout<N, E> {
+
+    public HierarchicalGraphLayout() {
+    }
+
+    private class LinkWrapper implements Link {
+
+        private VertexWrapper from;
+        private VertexWrapper to;
+
+        public LinkWrapper(VertexWrapper from, VertexWrapper to) {
+            this.from = from;
+            this.to = to;
+        }
+
+        public Port getFrom() {
+            return from.getSlot();
+        }
+
+        public Port getTo() {
+            return to.getSlot();
+        }
+
+        public List<Point> getControlPoints() {
+            return new ArrayList<Point>();
+        }
+
+        public void setControlPoints(List<Point> list) {
+        // Do nothing for now
+        }
+    }
+
+    private class VertexWrapper implements Vertex {
+
+        private N node;
+        private UniversalGraph<N, E> graph;
+        private Port slot;
+        private Point position;
+
+        public VertexWrapper(N node, UniversalGraph<N, E> graph) {
+            this.node = node;
+            this.graph = graph;
+            final VertexWrapper vertex = this;
+            this.slot = new Port() {
+
+                public Vertex getVertex() {
+                    return vertex;
+                }
+
+                public Point getRelativePosition() {
+                    return new Point((int) (vertex.getSize().getWidth() / 2), (int) (vertex.getSize().getHeight() / 2));
+                }
+            };
+
+            Widget w = graph.getScene().findWidget(node);
+            this.position = w.getPreferredLocation();
+        }
+
+        public Cluster getCluster() {
+            return null;
+        }
+
+        public Dimension getSize() {
+            Widget w = graph.getScene().findWidget(node);
+            return w.getBounds().getSize();
+        }
+
+        public Point getPosition() {
+            return position;
+        }
+
+        public void setPosition(Point p) {
+            HierarchicalGraphLayout.this.setResolvedNodeLocation(graph, node, p);
+            position = p;
+        }
+
+        public boolean isRoot() {
+            return false;
+        }
+
+        public int compareTo(Vertex o) {
+            VertexWrapper vw = (VertexWrapper) o;
+            return node.toString().compareTo(vw.node.toString());
+        }
+
+        public Port getSlot() {
+            return slot;
+        }
+    }
+
+    protected void performGraphLayout(UniversalGraph<N, E> graph) {
+
+        Set<LinkWrapper> links = new HashSet<LinkWrapper>();
+        Set<VertexWrapper> vertices = new HashSet<VertexWrapper>();
+        Map<N, VertexWrapper> vertexMap = new HashMap<N, VertexWrapper>();
+
+        for (N node : graph.getNodes()) {
+            VertexWrapper v = new VertexWrapper(node, graph);
+            vertexMap.put(node, v);
+            vertices.add(v);
+        }
+
+        for (E edge : graph.getEdges()) {
+            N source = graph.getEdgeSource(edge);
+            N target = graph.getEdgeTarget(edge);
+            LinkWrapper l = new LinkWrapper(vertexMap.get(source), vertexMap.get(target));
+            links.add(l);
+        }
+
+        HierarchicalLayoutManager m = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.NONE);
+
+        LayoutGraph layoutGraph = new LayoutGraph(links, vertices);
+        m.doLayout(layoutGraph);
+    }
+
+    protected void performNodesLayout(UniversalGraph<N, E> graph, Collection<N> nodes) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml
new file mode 100644
index 0000000..36b0e8c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="ControlFlowAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="ControlFlowTopComponent.settings" url="ControlFlowTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <folder name="customRightTopMode">
+                <file name="ControlFlowTopComponent.wstcref" url="ControlFlowTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml
new file mode 100644
index 0000000..a70f008
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.coordinator" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.coordinator.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf
new file mode 100644
index 0000000..073c1e8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.coordinator

+OpenIDE-Module-Layer: com/sun/hotspot/igv/coordinator/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/coordinator/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml
new file mode 100644
index 0000000..4deca64
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.coordinator-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties
new file mode 100644
index 0000000..71781f9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=077de97c
+build.xml.script.CRC32=d29d586c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=077de97c
+nbproject/build-impl.xml.script.CRC32=03daa42d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml
new file mode 100644
index 0000000..ad5afed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.coordinator</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.progress</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.10.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer
new file mode 100644
index 0000000..bf7aace
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer
@@ -0,0 +1,2 @@
+com.sun.hotspot.igv.coordinator.StandardGroupOrganizer

+com.sun.hotspot.igv.coordinator.GraphCountGroupOrganizer
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties
new file mode 100644
index 0000000..455f648
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties
@@ -0,0 +1,7 @@
+
+AdvancedOption_DisplayName_Coordinator=Settings
+AdvancedOption_Tooltip_Coordinator=Visualization Tool Settings
+CTL_OutlineTopComponent=Outline Window
+CTL_SomeAction=test
+HINT_OutlineTopComponent=This is a Outline window
+OpenIDE-Module-Name=Coordinator
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java
new file mode 100644
index 0000000..b5398ed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.Pair;
+import java.awt.Image;
+import java.util.ArrayList;
+import java.util.List;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FolderNode extends AbstractNode {
+
+    private GroupOrganizer organizer;
+    private InstanceContent content;
+    private List<Pair<String, List<Group>>> structure;
+    private List<String> subFolders;
+    private FolderChildren children;
+
+    private static class FolderChildren extends Children.Keys {
+
+        private FolderNode parent;
+
+        public void setParent(FolderNode parent) {
+            this.parent = parent;
+        }
+
+        @Override
+        protected Node[] createNodes(Object arg0) {
+
+            Pair<String, List<Group>> p = (Pair<String, List<Group>>) arg0;
+            if (p.getLeft().length() == 0) {
+
+                List<Node> curNodes = new ArrayList<Node>();
+                for (Group g : p.getRight()) {
+                    for (InputGraph graph : g.getGraphs()) {
+                        curNodes.add(new GraphNode(graph));
+                    }
+                }
+
+                Node[] result = new Node[curNodes.size()];
+                for (int i = 0; i < curNodes.size(); i++) {
+                    result[i] = curNodes.get(i);
+                }
+                return result;
+
+            } else {
+                return new Node[]{new FolderNode(p.getLeft(), parent.organizer, parent.subFolders, p.getRight())};
+            }
+        }
+
+        @Override
+        public void addNotify() {
+            this.setKeys(parent.structure);
+
+        }
+    }
+
+    protected InstanceContent getContent() {
+        return content;
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif");
+    }
+
+    protected FolderNode(String name, GroupOrganizer organizer, List<String> subFolders, List<Group> groups) {
+        this(name, organizer, subFolders, groups, new FolderChildren(), new InstanceContent());
+    }
+
+    private FolderNode(String name, GroupOrganizer organizer, List<String> oldSubFolders, final List<Group> groups, FolderChildren children, InstanceContent content) {
+        super(children, new AbstractLookup(content));
+        children.setParent(this);
+        this.content = content;
+        this.children = children;
+        content.add(new RemoveCookie() {
+
+            public void remove() {
+                for (Group g : groups) {
+                    if (g.getDocument() != null) {
+                        g.getDocument().removeGroup(g);
+                    }
+                }
+            }
+        });
+        init(name, organizer, oldSubFolders, groups);
+    }
+
+    public void init(String name, GroupOrganizer organizer, List<String> oldSubFolders, List<Group> groups) {
+        this.setDisplayName(name);
+        this.organizer = organizer;
+        this.subFolders = new ArrayList<String>(oldSubFolders);
+        if (name.length() > 0) {
+            this.subFolders.add(name);
+        }
+        structure = organizer.organize(subFolders, groups);
+        assert structure != null;
+        children.addNotify();
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java
new file mode 100644
index 0000000..42648d0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphCountGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "Graph count structure";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (subFolders.size() == 0) {
+            Map<Integer, List<Group>> map = new HashMap<Integer, List<Group>>();
+            for (Group g : groups) {
+                Integer cur = g.getGraphs().size();
+                if (!map.containsKey(cur)) {
+                    map.put(cur, new ArrayList<Group>());
+                }
+                map.get(cur).add(g);
+            }
+
+            SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
+            for (Integer i : keys) {
+                result.add(new Pair<String, List<Group>>("Graph count " + i, map.get(i)));
+            }
+
+        } else if (subFolders.size() == 1) {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(g.getName());
+                p.setRight(children);
+                result.add(p);
+            }
+        } else if (subFolders.size() == 2) {
+            result.add(new Pair<String, List<Group>>("", groups));
+        }
+
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java
new file mode 100644
index 0000000..0fd780c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphAction;
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphCookie;
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.Image;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.cookies.OpenCookie;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphNode extends AbstractNode {
+
+    private InputGraph graph;
+
+    /** Creates a new instance of GraphNode */
+    public GraphNode(InputGraph graph) {
+        this(graph, new InstanceContent());
+    }
+
+    private GraphNode(final InputGraph graph, InstanceContent content) {
+        super(Children.LEAF, new AbstractLookup(content));
+        this.graph = graph;
+        this.setDisplayName(graph.getName());
+        content.add(graph);
+
+        final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+        if (viewer != null) {
+            // Action for opening the graph
+            content.add(new OpenCookie() {
+
+                public void open() {
+                    viewer.view(graph);
+                }
+            });
+        }
+
+        // Action for removing a graph
+        content.add(new RemoveCookie() {
+
+            public void remove() {
+                graph.getGroup().removeGraph(graph);
+            }
+        });
+    }
+
+    @Override
+    protected Sheet createSheet() {
+        Sheet s = super.createSheet();
+        PropertiesSheet.initializeSheet(graph.getProperties(), s);
+        return s;
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif");
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    @Override
+    public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+        if (aClass == DiffGraphCookie.class) {
+            InputGraphProvider graphProvider = Utilities.actionsGlobalContext().lookup(InputGraphProvider.class);
+
+            InputGraph graphA = null;
+            if (graphProvider != null) {
+                graphA = graphProvider.getGraph();
+            }
+
+            if (graphA != null && !graphA.isDifferenceGraph()) {
+                return (T) new DiffGraphCookie(graphA, graph);
+            }
+        }
+
+        return super.getCookie(aClass);
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) DiffGraphAction.findObject(DiffGraphAction.class, true), (Action) OpenAction.findObject(OpenAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return (Action) OpenAction.findObject(OpenAction.class, true);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form
new file mode 100644
index 0000000..37e033f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel2">
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="Center"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new BeanTreeView();"/>
+          </AuxValues>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="Center"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java
new file mode 100644
index 0000000..9e6177b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.ImportAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAsAction;
+import com.sun.hotspot.igv.coordinator.actions.StructuredViewAction;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.ErrorManager;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class OutlineTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+    public static OutlineTopComponent instance;
+    public static final String PREFERRED_ID = "OutlineTopComponent";
+    private ExplorerManager manager;
+    private GraphDocument document;
+    private FolderNode root;
+    private GroupOrganizer organizer;
+
+    private OutlineTopComponent() {
+        initComponents();
+
+        setName(NbBundle.getMessage(OutlineTopComponent.class, "CTL_OutlineTopComponent"));
+        setToolTipText(NbBundle.getMessage(OutlineTopComponent.class, "HINT_OutlineTopComponent"));
+
+        document = new GraphDocument();
+        initListView();
+        initToolbar();
+        initReceivers();
+    }
+
+    private void initListView() {
+        manager = new ExplorerManager();
+        organizer = new StandardGroupOrganizer();
+        root = new FolderNode("", organizer, new ArrayList<String>(), document.getGroups());
+        manager.setRootContext(root);
+        ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+
+        document.getChangedEvent().addListener(new ChangedListener<GraphDocument>() {
+
+            public void changed(GraphDocument document) {
+                updateStructure();
+            }
+        });
+
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+    }
+
+    private void initToolbar() {
+
+        Toolbar toolbar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolbar.setBorder(b);
+        this.add(toolbar, BorderLayout.NORTH);
+
+        toolbar.add(ImportAction.get(ImportAction.class));
+        toolbar.add(((NodeAction) RemoveAction.get(RemoveAction.class)).createContextAwareInstance(this.getLookup()));
+        toolbar.add(RemoveAllAction.get(RemoveAllAction.class));
+
+        toolbar.add(((NodeAction) SaveAsAction.get(SaveAsAction.class)).createContextAwareInstance(this.getLookup()));
+        toolbar.add(SaveAllAction.get(SaveAllAction.class));
+
+        toolbar.add(StructuredViewAction.get(StructuredViewAction.class).getToolbarPresenter());
+
+        for (Toolbar tb : ToolbarPool.getDefault().getToolbars()) {
+            tb.setVisible(false);
+        }
+
+        initOrganizers();
+    }
+
+    public void setOrganizer(GroupOrganizer organizer) {
+        this.organizer = organizer;
+        updateStructure();
+    }
+
+    private void initOrganizers() {
+
+    }
+
+    private void initReceivers() {
+
+        final GroupCallback callback = new GroupCallback() {
+
+            public void started(Group g) {
+                getDocument().addGroup(g);
+            }
+        };
+
+        Collection<? extends GroupReceiver> receivers = Lookup.getDefault().lookupAll(GroupReceiver.class);
+        if (receivers.size() > 0) {
+            JPanel panel = new JPanel();
+            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+
+            for (GroupReceiver r : receivers) {
+                Component c = r.init(callback);
+                panel.add(c);
+            }
+
+            jPanel2.add(panel, BorderLayout.PAGE_START);
+        }
+    }
+
+    private void updateStructure() {
+        root.init("", organizer, new ArrayList<String>(), document.getGroups());
+    }
+
+    public void clear() {
+        document.clear();
+    }
+
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    public GraphDocument getDocument() {
+        return document;
+    }
+
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized OutlineTopComponent getDefault() {
+        if (instance == null) {
+            instance = new OutlineTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the OutlineTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized OutlineTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Outline component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof OutlineTopComponent) {
+            return (OutlineTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        this.requestActive();
+    }
+
+    @Override
+    public void componentClosed() {
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+    }
+
+    @Override
+    public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
+        // Not called when user starts application for the first time
+        super.readExternal(objectInput);
+        ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+    }
+
+    @Override
+    public void writeExternal(ObjectOutput objectOutput) throws IOException {
+        super.writeExternal(objectOutput);
+    }
+
+    static final class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return OutlineTopComponent.getDefault();
+        }
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel2 = new javax.swing.JPanel();
+        jScrollPane1 = new BeanTreeView();
+
+        setLayout(new java.awt.BorderLayout());
+
+        jPanel2.setLayout(new java.awt.BorderLayout());
+        jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+
+        add(jPanel2, java.awt.BorderLayout.CENTER);
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JPanel jPanel2;
+    private javax.swing.JScrollPane jScrollPane1;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml
new file mode 100644
index 0000000..1acdbcb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+    <instanceof class="at.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.coordinator.OutlineTopComponent"/>
+    <instance class="com.sun.hotspot.igv.coordinator.OutlineTopComponent" method="getDefault"/>
+</settings>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml
new file mode 100644
index 0000000..329140e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+    <tc-id id="OutlineTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml
new file mode 100644
index 0000000..1e05bc2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configuration PUBLIC "-//NetBeans IDE//DTD toolbar//EN" "http://www.netbeans.org/dtds/toolbar.dtd">
+<Configuration>
+    <Row>
+        <Toolbar name="Edit" position="1" visible="false"/>
+        <Toolbar name="File" position="1" visible="false" />
+        <Toolbar name="Memory" position="1" visible="false" />
+    </Row>
+    <Row>
+        <Toolbar name="WorkspaceSwitcher" />
+        <Toolbar name="StatusLine" />
+    </Row>
+</Configuration>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java
new file mode 100644
index 0000000..d907ba8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class StandardGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "-- None --";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (groups.size() == 1 && subFolders.size() > 0) {
+            result.add(new Pair<String, List<Group>>("", groups));
+        } else {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(g.getName());
+                p.setRight(children);
+                result.add(p);
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties
new file mode 100644
index 0000000..5b5b93f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties
@@ -0,0 +1,18 @@
+CTL_EditFilterAction=Edit...
+CTL_ImportAction=Open...
+CTL_OpenGraphAction=View graph
+CTL_DiffGraphAction=Difference to current graph
+CTL_RemoveAction=Remove methods
+CTL_ApplyFilterAction=Apply
+CTL_FilterAction=Open Filter Window
+CTL_AppliedFilterAction=Open AppliedFilter Window
+CTL_OutlineAction=Open Outline Window
+CTL_MoveFilterUpAction=Move upwards
+CTL_MoveFilterDownAction=Move downwards
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveAsAction=Save selected methods...
+CTL_SaveAllAction=Save all...
+CTL_SaveFilterSettingsAction=Save filter settings...
+CTL_PropertiesAction=Open Properties Window
+CTL_NewFilterAction=New filter...
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java
new file mode 100644
index 0000000..3e7737e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class DiffGraphAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        DiffGraphCookie c = activatedNodes[0].getCookie(DiffGraphCookie.class);
+        c.openDiff();
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(DiffGraphAction.class, "CTL_DiffGraphAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            DiffGraphCookie.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/diff.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java
new file mode 100644
index 0000000..b95ecf0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.difference.Difference;
+import org.openide.nodes.Node;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiffGraphCookie implements Node.Cookie {
+
+    private InputGraph a;
+    private InputGraph b;
+
+    public DiffGraphCookie(InputGraph a, InputGraph b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    public void openDiff() {
+
+        final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+        if(viewer != null) {
+            InputGraph diffGraph = Difference.createDiffGraph(a, b);
+            viewer.view(diffGraph);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java
new file mode 100644
index 0000000..cc1e4b1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.data.serialization.XMLParser;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ImportAction extends CallableSystemAction {
+
+    public static FileFilter getFileFilter() {
+        return new FileFilter() {
+
+            public boolean accept(File f) {
+                return f.getName().toLowerCase().endsWith(".xml") || f.isDirectory();
+            }
+
+            public String getDescription() {
+                return "XML files (*.xml)";
+            }
+        };
+    }
+
+    public void performAction() {
+
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(ImportAction.getFileFilter());
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+
+            try {
+                final XMLReader reader = XMLUtil.createXMLReader();
+                final FileInputStream inputStream = new FileInputStream(file);
+                final InputSource is = new InputSource(inputStream);
+
+                final ProgressHandle handle = ProgressHandleFactory.createHandle("Opening file " + file.getName());
+                final int basis = 1000;
+                handle.start(basis);
+                final int start = inputStream.available();
+
+                final XMLParser.ParseMonitor parseMonitor = new XMLParser.ParseMonitor() {
+
+                    public void setProgress(double d) {
+                        try {
+                            int curAvailable = inputStream.available();
+                            int prog = (int) (basis * (double) (start - curAvailable) / (double) start);
+                            handle.progress(prog);
+                        } catch (IOException ex) {
+                        }
+                    }
+
+                    public void setState(String state) {
+                        setProgress(0.0);
+                        handle.progress(state);
+                    }
+                };
+                final Parser parser = new Parser();
+                final OutlineTopComponent component = OutlineTopComponent.findInstance();
+
+                component.requestActive();
+
+                RequestProcessor.getDefault().post(new Runnable() {
+
+                    public void run() {
+                        GraphDocument document = null;
+                        try {
+                            document = parser.parse(reader, is, parseMonitor);
+                            parseMonitor.setState("Finishing");
+                            component.getDocument().addGraphDocument(document);
+                        } catch (SAXException ex) {
+                            String s = "Exception during parsing the XML file, could not load document!";
+                            if (ex instanceof XMLParser.MissingAttributeException) {
+                                XMLParser.MissingAttributeException e = (XMLParser.MissingAttributeException) ex;
+                                s += "\nMissing attribute \"" + e.getAttributeName() + "\"";
+                            }
+                            ex.printStackTrace();
+                            NotifyDescriptor d = new NotifyDescriptor.Message(s, NotifyDescriptor.ERROR_MESSAGE);
+                            DialogDisplayer.getDefault().notify(d);
+                        }
+                        handle.finish();
+                    }
+                });
+
+            } catch (SAXException ex) {
+                ex.printStackTrace();
+            } catch (FileNotFoundException ex) {
+                ex.printStackTrace();
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(ImportAction.class, "CTL_ImportAction");
+    }
+
+    public ImportAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Open an XML graph document");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/import.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java
new file mode 100644
index 0000000..580d1fa
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutlineAction extends AbstractAction {
+
+    public OutlineAction() {
+        super(NbBundle.getMessage(OutlineAction.class, "CTL_OutlineAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = OutlineTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java
new file mode 100644
index 0000000..180cb84
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAction extends NodeAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            RemoveCookie removeCookie = n.getCookie(RemoveCookie.class);
+            if (removeCookie != null) {
+                removeCookie.remove();
+            }
+        }
+    }
+
+    public RemoveAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveAction.class, "CTL_RemoveAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/remove.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    protected boolean enable(Node[] nodes) {
+        return nodes.length > 0;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java
new file mode 100644
index 0000000..6837252
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAllAction extends CallableSystemAction {
+
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveAllAction.class, "CTL_ImportAction");
+    }
+
+    public RemoveAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove all methods");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/removeall.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    public void performAction() {
+        OutlineTopComponent.findInstance().clear();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java
new file mode 100644
index 0000000..7fc2989
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface RemoveCookie extends Node.Cookie {
+        void remove();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java
new file mode 100644
index 0000000..af56a00
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAllAction extends CallableSystemAction {
+
+    public void performAction() {
+        final OutlineTopComponent component = OutlineTopComponent.findInstance();
+        SaveAsAction.save(component.getDocument());
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveAllAction.class, "CTL_SaveAllAction");
+    }
+
+    public SaveAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Save all methods to XML file");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/saveall.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java
new file mode 100644
index 0000000..d8565b0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.serialization.Printer;
+import com.sun.hotspot.igv.settings.Settings;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import javax.swing.JFileChooser;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAsAction extends NodeAction {
+
+    protected void performAction(Node[] activatedNodes) {
+
+        GraphDocument doc = new GraphDocument();
+        for (Node n : activatedNodes) {
+            Group group = n.getLookup().lookup(Group.class);
+            doc.addGroup(group);
+        }
+
+        save(doc);
+    }
+
+    public static void save(GraphDocument doc) {
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(ImportAction.getFileFilter());
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+        if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+            if (!file.getName().contains(".")) {
+                file = new File(file.getAbsolutePath() + ".xml");
+            }
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+            try {
+                Writer writer = new OutputStreamWriter(new FileOutputStream(file));
+                Printer p = new Printer();
+                p.export(writer, doc);
+                writer.close();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+
+            }
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_SOME;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveAsAction.class, "CTL_SaveAsAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/save.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    protected boolean enable(Node[] nodes) {
+
+        int cnt = 0;
+        for (Node n : nodes) {
+            cnt += n.getLookup().lookupAll(Group.class).size();
+        }
+
+        return cnt > 0;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java
new file mode 100644
index 0000000..1486c2e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.awt.Component;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.Action;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.openide.awt.DropDownButtonFactory;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+public class StructuredViewAction extends CallableSystemAction {
+
+    private static JButton dropDownButton;
+    private static ButtonGroup buttonGroup;
+    private static JPopupMenu popup;
+    private MyMenuItemListener menuItemListener;
+    private Map<JMenuItem, GroupOrganizer> map;
+
+    public StructuredViewAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+    }
+
+    @Override
+    public Component getToolbarPresenter() {
+
+        Image iconImage = Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif");
+        ImageIcon icon = new ImageIcon(iconImage);
+
+        popup = new JPopupMenu();
+
+        menuItemListener = new MyMenuItemListener();
+
+        buttonGroup = new ButtonGroup();
+
+        Collection<? extends GroupOrganizer> organizersCollection = Lookup.getDefault().lookupAll(GroupOrganizer.class);
+
+        List<GroupOrganizer> organizers = new ArrayList<GroupOrganizer>(organizersCollection);
+        Collections.sort(organizers, new Comparator<GroupOrganizer>() {
+            public int compare(GroupOrganizer a, GroupOrganizer b) {
+                return a.getName().compareTo(b.getName());
+            }
+        });
+
+        map = new HashMap<JMenuItem, GroupOrganizer>();
+
+        boolean first = true;
+        for(GroupOrganizer organizer : organizers) {
+            JCheckBoxMenuItem item = new JCheckBoxMenuItem(organizer.getName());
+            map.put(item, organizer);
+            item.addActionListener(menuItemListener);
+            buttonGroup.add(item);
+            popup.add(item);
+            if(first) {
+                item.setSelected(true);
+                first = false;
+            }
+        }
+
+        dropDownButton = DropDownButtonFactory.createDropDownButton(
+                new ImageIcon(
+                new BufferedImage(32, 32, BufferedImage.TYPE_BYTE_GRAY)),
+                popup);
+
+        dropDownButton.setIcon(icon);
+
+        dropDownButton.setToolTipText("Insert Layer Registration");
+
+        dropDownButton.addItemListener(new ItemListener() {
+
+            public void itemStateChanged(ItemEvent e) {
+                int state = e.getStateChange();
+                if (state == ItemEvent.SELECTED) {
+                    performAction();
+                }
+            }
+        });
+
+        dropDownButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                performAction();
+            }
+        });
+
+        popup.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+                dropDownButton.setSelected(false);
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                dropDownButton.setSelected(false);
+            }
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                dropDownButton.setSelected(true);
+            }
+        });
+
+        return dropDownButton;
+
+    }
+
+    private class MyMenuItemListener implements ActionListener {
+
+        public void actionPerformed(ActionEvent ev) {
+            JMenuItem item = (JMenuItem) ev.getSource();
+            GroupOrganizer organizer = map.get(item);
+            assert organizer != null : "Organizer must exist!";
+            OutlineTopComponent.findInstance().setOrganizer(organizer);
+        }
+    }
+
+
+    @Override
+    public void performAction() {
+        popup.show(dropDownButton, 0, dropDownButton.getHeight());
+    }
+
+    public String getName() {
+        return "Structured View";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml
new file mode 100644
index 0000000..2655e46
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+    <name unique="customLeft" />
+    <kind type="view" />
+    <state type="joined" />
+    <constraints>
+        <path orientation="horizontal" number="0" weight="0.779245283018868"/>
+        <path orientation="vertical" number="0" weight="0.7511825922421949"/>
+        <path orientation="horizontal" number="0" weight="0.5"/>
+        <path orientation="vertical" number="20" weight="0.7"/>
+        <path orientation="horizontal" number="40" weight="0.55"/>
+        <path orientation="horizontal" number="0" weight="0.2711864406779661"/>
+    </constraints>
+    <bounds x="0" y="0" width="0" height="0" />
+    <frame state="0"/>
+    <active-tc id="OutlineTopComponent"/>
+    <empty-behavior permanent="false"/>
+</mode>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif
new file mode 100644
index 0000000..6e49c31
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif
new file mode 100644
index 0000000..2d3ca05
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif
new file mode 100644
index 0000000..7a4e5fc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif
new file mode 100644
index 0000000..c0b2ca2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif
new file mode 100644
index 0000000..9dc0824
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif
new file mode 100644
index 0000000..9eeab3c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif
new file mode 100644
index 0000000..954f1ac
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif
new file mode 100644
index 0000000..2d31c8b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif
new file mode 100644
index 0000000..2be8487
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif
new file mode 100644
index 0000000..71aa946
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml
new file mode 100644
index 0000000..999997d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <attr name="Actions\Edit\com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance\position" intvalue="200"/>
+    <attr name="Actions\Edit\org-netbeans-core-ui-sysopen-SystemOpenAction.instance\position" intvalue="100"/>
+    <attr name="Actions\Edit\org-openide-actions-CopyAction.instance\position" intvalue="1300"/>
+    <attr name="Actions\Edit\org-openide-actions-CutAction.instance\position" intvalue="1400"/>
+    <attr name="Actions\Edit\org-openide-actions-DeleteAction.instance\position" intvalue="1500"/>
+    <attr name="Actions\Edit\org-openide-actions-FindAction.instance\position" intvalue="1600"/>
+    <attr name="Actions\Edit\org-openide-actions-GotoAction.instance\position" intvalue="1700"/>
+    <attr name="Actions\Edit\org-openide-actions-PasteAction.instance\position" intvalue="1800"/>
+    <attr name="Actions\Edit\org-openide-actions-RedoAction.instance\position" intvalue="1900"/>
+    <attr name="Actions\Edit\org-openide-actions-ReplaceAction.instance\position" intvalue="2000"/>
+    <attr name="Actions\Edit\org-openide-actions-UndoAction.instance\position" intvalue="2100"/>
+
+    <folder name="Actions">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance">
+                <attr name="position" intvalue="700"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance">
+                <attr name="position" intvalue="800"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.instance">
+                <attr name="position" intvalue="1000"/>
+            </file>
+        </folder>
+        <folder name="Edit">
+
+            <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance">
+                <attr name="position" intvalue="1200"/>
+            </file>
+        </folder>
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-ImportAction.instance"/>
+                <attr name="position" intvalue="100"/>
+            </file>
+            <file name="MySeparator2.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="300"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance"/>
+                <attr name="position" intvalue="300"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance"/>
+                <attr name="position" intvalue="400"/>
+            </file>
+            <file name="MySeparator3.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="500"/>
+            </file>
+
+            <file name="org-netbeans-modules-openfile-OpenFileAction.instance_hidden"/>
+            <file name="org-openide-actions-PageSetupAction.instance_hidden"/>
+            <file name="org-openide-actions-PrintAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAllAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAsAction.shadow_hidden"/>
+        </folder>
+        <folder name="Edit">
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance"/>
+            </file>
+            <file name="org-netbeans-core-actions-JumpNextAction.shadow_hidden"/>
+            <file name="org-netbeans-core-actions-JumpPrevAction.shadow_hidden"/>
+            <file name="org-openide-actions-CutAction.instance_hidden"/>
+            <file name="org-openide-actions-CopyAction.instance_hidden"/>
+            <file name="org-openide-actions-PasteAction.instance_hidden"/>
+            <file name="org-openide-actions-DeleteAction.instance_hidden"/>
+            <file name="org-openide-actions-FindAction.instance_hidden"/>
+            <file name="org-openide-actions-ReplaceAction.instance_hidden"/>
+            <file name="org-openide-actions-JumpNextAction.shadow_hidden"/>
+            <file name="org-openide-actions-JumpPrevAction.shadow_hidden"/>
+        </folder>
+        <file name="GoTo_hidden"/>
+        <folder name="View">
+            <file name="Separator1.instance_hidden"/>
+            <file name="Separator2.instance_hidden"/>
+            <file name="org-netbeans-core-actions-HTMLViewAction.instance_hidden"/>
+            <file name="org-netbeans-core-actions-LogAction.instance_hidden"/>
+            <file name="org-netbeans-core-windows-actions-ToolbarsListAction.instance_hidden"/>
+        </folder>
+        <folder name="Window">
+            <file name="OutlineAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Toolbars">
+        <file name="Standard.xml" url="StandardConfiguration.xml"/>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="OutlineTopComponent.settings" url="OutlineTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <file name="customLeft.wsmode" url="customLeftWsmode.xml"/>
+            <folder name="customLeft">
+                <file name="OutlineTopComponent.wstcref" url="OutlineTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml
new file mode 100644
index 0000000..dd62606
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.data" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.data.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf
new file mode 100644
index 0000000..702ae87
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.data

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/data/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml
new file mode 100644
index 0000000..942d7a6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.data-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties
new file mode 100644
index 0000000..621e413
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a403efd8
+build.xml.script.CRC32=b87f73ba
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a403efd8
+nbproject/build-impl.xml.script.CRC32=cc649146
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml
new file mode 100644
index 0000000..dce4d28
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.data</package>
+                <package>com.sun.hotspot.igv.data.serialization</package>
+                <package>com.sun.hotspot.igv.data.services</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties
new file mode 100644
index 0000000..f17788c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=Data
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java
new file mode 100644
index 0000000..18a8ced
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ChangedEvent<T> extends Event<ChangedListener<T>> {
+
+    private T object;
+
+    public ChangedEvent() {
+    }
+
+    public ChangedEvent(T object) {
+        this.object = object;
+    }
+
+    protected void fire(ChangedListener<T> l) {
+        l.changed(object);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java
new file mode 100644
index 0000000..5e2978e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedEventProvider<T> {
+
+    public ChangedEvent<T> getChangedEvent();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java
new file mode 100644
index 0000000..806b339
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedListener<T> {
+
+    public void changed(T source);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java
new file mode 100644
index 0000000..c31e593
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Event<L> {
+
+    private List<L> listener;
+
+    public Event() {
+        listener = new ArrayList<L>();
+    }
+
+    public void addListener(L l) {
+        listener.add(l);
+    }
+
+    public void removeListener(L l) {
+        listener.remove(l);
+    }
+
+    public void fire() {
+        List<L> tmpList = new ArrayList<L>(listener);
+        for (L l : tmpList) {
+            fire(l);
+        }
+    }
+
+    protected abstract void fire(L l);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java
new file mode 100644
index 0000000..27d09c3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphDocument extends Properties.Object implements ChangedEventProvider<GraphDocument> {
+
+    private List<Group> groups;
+    private ChangedEvent<GraphDocument> changedEvent;
+
+    public GraphDocument() {
+        groups = new ArrayList<Group>();
+        changedEvent = new ChangedEvent<GraphDocument>(this);
+    }
+
+    public void clear() {
+        groups.clear();
+        getChangedEvent().fire();
+    }
+
+    public ChangedEvent<GraphDocument> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public List<Group> getGroups() {
+        return Collections.unmodifiableList(groups);
+    }
+
+    public void addGroup(Group group) {
+        group.setDocument(this);
+        groups.add(group);
+        getChangedEvent().fire();
+    }
+
+    public void removeGroup(Group group) {
+        if (groups.contains(group)) {
+            group.setDocument(null);
+            groups.remove(group);
+            getChangedEvent().fire();
+        }
+    }
+
+    public void addGraphDocument(GraphDocument document) {
+        for (Group g : document.groups) {
+            this.addGroup(g);
+        }
+        document.clear();
+        getChangedEvent().fire();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("GraphDocument: " + getProperties().toString() + " \n\n");
+        for (Group g : getGroups()) {
+            sb.append(g.toString());
+            sb.append("\n\n");
+        }
+
+        return sb.toString();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java
new file mode 100644
index 0000000..8f0aa15
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Group extends Properties.Object implements ChangedEventProvider<Group> {
+
+    private List<InputGraph> graphs;
+    private transient ChangedEvent<Group> changedEvent;
+    private GraphDocument document;
+    private InputMethod method;
+    private String assembly;
+
+    public Group() {
+        graphs = new ArrayList<InputGraph>();
+        init();
+    }
+
+    private void init() {
+        changedEvent = new ChangedEvent<Group>(this);
+    }
+
+    public void fireChangedEvent() {
+        changedEvent.fire();
+    }
+
+    public void setAssembly(String s) {
+        this.assembly = s;
+    }
+
+    public String getAssembly() {
+        return assembly;
+    }
+
+    public void setMethod(InputMethod method) {
+        this.method = method;
+    }
+
+    public InputMethod getMethod() {
+        return method;
+    }
+
+    void setDocument(GraphDocument document) {
+        this.document = document;
+    }
+
+    public GraphDocument getDocument() {
+        return document;
+    }
+
+    public ChangedEvent<Group> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public List<InputGraph> getGraphs() {
+        return Collections.unmodifiableList(graphs);
+    }
+
+    public void addGraph(InputGraph g) {
+        assert g != null;
+        assert !graphs.contains(g);
+        graphs.add(g);
+        changedEvent.fire();
+    }
+
+    public void removeGraph(InputGraph g) {
+        int index = graphs.indexOf(g);
+        if (index != -1) {
+            graphs.remove(g);
+            changedEvent.fire();
+        }
+    }
+
+    public Set<Integer> getAllNodes() {
+        Set<Integer> result = new HashSet<Integer>();
+        for (InputGraph g : graphs) {
+            Set<Integer> ids = g.getNodesAsSet();
+            result.addAll(g.getNodesAsSet());
+            for (Integer i : ids) {
+                result.add(-i);
+            }
+        }
+        return result;
+    }
+
+    public InputGraph getLastAdded() {
+        if (graphs.size() == 0) {
+            return null;
+        }
+        return graphs.get(graphs.size() - 1);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Group " + getProperties().toString() + "\n");
+        for (InputGraph g : graphs) {
+            sb.append(g.toString());
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java
new file mode 100644
index 0000000..1c13677
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlock {
+
+    private List<InputNode> nodes;
+    private List<String> successorNames;
+    private String name;
+    private InputGraph graph;
+    private Rectangle bounds;
+    private Set<InputBlock> successors;
+    private Set<InputBlock> predecessors;
+    private Set<InputBlockEdge> inputs;
+    private Set<InputBlockEdge> outputs;
+
+    public InputBlock(InputGraph graph, String name) {
+        this.graph = graph;
+        this.name = name;
+        nodes = new ArrayList<InputNode>();
+        successorNames = new ArrayList<String>();
+        successors = new HashSet<InputBlock>();
+        predecessors = new HashSet<InputBlock>();
+        inputs = new HashSet<InputBlockEdge>();
+        outputs = new HashSet<InputBlockEdge>();
+    }
+
+    public void removeSuccessor(InputBlock b) {
+        if (successors.contains(b)) {
+            successors.remove(b);
+            b.predecessors.remove(this);
+            InputBlockEdge e = new InputBlockEdge(this, b);
+            assert outputs.contains(e);
+            outputs.remove(e);
+            assert b.inputs.contains(e);
+            b.inputs.remove(e);
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String s) {
+        name = s;
+    }
+
+    public List<InputNode> getNodes() {
+        return Collections.unmodifiableList(nodes);
+    }
+
+    public void addNode(int id) {
+        InputNode n = graph.getNode(id);
+        assert n != null;
+        graph.setBlock(n, this);
+        addNode(graph.getNode(id));
+    }
+
+    public void addNode(InputNode node) {
+        assert !nodes.contains(node);
+        nodes.add(node);
+    }
+
+    public Set<InputBlock> getPredecessors() {
+        return Collections.unmodifiableSet(predecessors);
+    }
+
+    public Set<InputBlock> getSuccessors() {
+        return Collections.unmodifiableSet(successors);
+    }
+
+    public Set<InputBlockEdge> getInputs() {
+        return Collections.unmodifiableSet(inputs);
+    }
+
+    public Set<InputBlockEdge> getOutputs() {
+        return Collections.unmodifiableSet(outputs);
+    }
+
+    // resolveBlockLinks must be called afterwards
+    public void addSuccessor(String name) {
+        successorNames.add(name);
+    }
+
+    public void resolveBlockLinks() {
+        for (String s : successorNames) {
+            InputBlock b = graph.getBlock(s);
+            addSuccessor(b);
+        }
+
+        successorNames.clear();
+    }
+
+    public void addSuccessor(InputBlock b) {
+        if (!successors.contains(b)) {
+            successors.add(b);
+            b.predecessors.add(this);
+            InputBlockEdge e = new InputBlockEdge(this, b);
+            outputs.add(e);
+            b.inputs.add(e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return this.getName();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java
new file mode 100644
index 0000000..10cac158
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlockEdge {
+
+    private InputBlock from;
+    private InputBlock to;
+
+    public InputBlockEdge(InputBlock from, InputBlock to) {
+        assert from != null;
+        assert to != null;
+        this.from = from;
+        this.to = to;
+    }
+
+    public InputBlock getFrom() {
+        return from;
+    }
+
+    public InputBlock getTo() {
+        return to;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof InputBlockEdge && obj != null) {
+            InputBlockEdge e = (InputBlockEdge) obj;
+            return e.from.equals(from) && e.to.equals(to);
+        }
+        return super.equals(obj);
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = from.hashCode();
+        hash = 59 * hash + to.hashCode();
+        return hash;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java
new file mode 100644
index 0000000..14ab1f3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBytecode {
+
+    private int bci;
+    private String name;
+    private InputMethod inlined;
+
+    public InputBytecode(int bci, String name) {
+        this.bci = bci;
+        this.name = name;
+    }
+
+    public InputMethod getInlined() {
+        return inlined;
+    }
+
+    public void setInlined(InputMethod inlined) {
+        this.inlined = inlined;
+    }
+
+    public int getBci() {
+        return bci;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java
new file mode 100644
index 0000000..d1c440e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputEdge {
+
+    public enum State {
+
+        SAME,
+        NEW,
+        DELETED
+    }
+    private char toIndex;
+    private int from;
+    private int to;
+    private State state;
+
+    public InputEdge(char toIndex, int from, int to) {
+        this.toIndex = toIndex;
+        this.from = from;
+        this.to = to;
+        this.state = State.SAME;
+    }
+
+    public State getState() {
+        return state;
+    }
+
+    public void setState(State x) {
+        this.state = x;
+    }
+
+    public char getToIndex() {
+        return toIndex;
+    }
+
+    public String getName() {
+        return "in" + toIndex;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public int getTo() {
+        return to;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || !(o instanceof InputEdge)) {
+            return false;
+        }
+        InputEdge conn2 = (InputEdge) o;
+        return conn2.toIndex == toIndex && conn2.from == from && conn2.to == to;
+    }
+
+    @Override
+    public String toString() {
+        return "Edge from " + from + " to " + to + "(" + (int) toIndex + ") ";
+    }
+
+    @Override
+    public int hashCode() {
+        return (from << 20 | to << 8 | toIndex);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java
new file mode 100644
index 0000000..b929fd6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputGraph extends Properties.Object {
+
+    private Map<Integer, InputNode> nodes;
+    private Set<InputEdge> edges;
+    private Group parent;
+    private Map<String, InputBlock> blocks;
+    private Map<Integer, InputBlock> nodeToBlock;
+    private boolean isDifferenceGraph;
+
+    public InputGraph(Group parent) {
+        this(parent, null);
+    }
+
+    public InputGraph(Group parent, InputGraph last) {
+        this(parent, last, "");
+    }
+
+    private void clearBlocks() {
+        blocks.clear();
+        nodeToBlock.clear();
+    }
+
+    public InputGraph(Group parent, InputGraph last, String name) {
+        this.parent = parent;
+        setName(name);
+        nodes = new Hashtable<Integer, InputNode>();
+        edges = new HashSet<InputEdge>();
+        blocks = new Hashtable<String, InputBlock>();
+        nodeToBlock = new Hashtable<Integer, InputBlock>();
+        if (last != null) {
+
+            for (InputNode n : last.getNodes()) {
+                addNode(n);
+            }
+
+            for (InputEdge c : last.getEdges()) {
+                addEdge(c);
+            }
+        }
+    }
+
+    public void schedule(Collection<InputBlock> newBlocks) {
+        clearBlocks();
+        InputBlock noBlock = new InputBlock(this, "no block");
+        Set<InputNode> scheduledNodes = new HashSet<InputNode>();
+
+        for (InputBlock b : newBlocks) {
+            for (InputNode n : b.getNodes()) {
+                assert !scheduledNodes.contains(n);
+                scheduledNodes.add(n);
+            }
+        }
+
+        for (InputNode n : this.getNodes()) {
+            assert nodes.get(n.getId()) == n;
+            if (!scheduledNodes.contains(n)) {
+                noBlock.addNode(n.getId());
+            }
+        }
+
+        if (noBlock.getNodes().size() != 0) {
+            newBlocks.add(noBlock);
+        }
+        for (InputBlock b : newBlocks) {
+            addBlock(b);
+        }
+
+        for (InputNode n : this.getNodes()) {
+            assert this.getBlock(n) != null;
+        }
+    }
+
+    public void setBlock(InputNode node, InputBlock block) {
+        nodeToBlock.put(node.getId(), block);
+    }
+
+    public InputBlock getBlock(int nodeId) {
+        return nodeToBlock.get(nodeId);
+    }
+
+    public InputBlock getBlock(InputNode node) {
+        return getBlock(node.getId());
+    }
+
+    public InputGraph getNext() {
+        List<InputGraph> list = parent.getGraphs();
+        if (!list.contains(this)) {
+            return null;
+        }
+        int index = list.indexOf(this);
+        if (index == list.size() - 1) {
+            return null;
+        } else {
+            return list.get(index + 1);
+        }
+    }
+
+    public InputGraph getPrev() {
+        List<InputGraph> list = parent.getGraphs();
+        if (!list.contains(this)) {
+            return null;
+        }
+        int index = list.indexOf(this);
+        if (index == 0) {
+            return null;
+        } else {
+            return list.get(index - 1);
+        }
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+
+    public String getAbsoluteName() {
+        String result = getName();
+        if (this.parent != null) {
+            result = parent.getName() + ": " + result;
+        }
+        return result;
+    }
+
+    public Collection<InputNode> getNodes() {
+        return Collections.unmodifiableCollection(nodes.values());
+    }
+
+    public Set<Integer> getNodesAsSet() {
+        return Collections.unmodifiableSet(nodes.keySet());
+    }
+
+    public Collection<InputBlock> getBlocks() {
+        return Collections.unmodifiableCollection(blocks.values());
+    }
+
+    public void addNode(InputNode node) {
+        nodes.put(node.getId(), node);
+    }
+
+    public InputNode getNode(int id) {
+        return nodes.get(id);
+    }
+
+    public InputNode removeNode(int index) {
+        return nodes.remove(index);
+    }
+
+    public Set<InputEdge> getEdges() {
+        return Collections.unmodifiableSet(edges);
+    }
+
+    public void removeEdge(InputEdge c) {
+        assert edges.contains(c);
+        edges.remove(c);
+        assert !edges.contains(c);
+    }
+
+    public void addEdge(InputEdge c) {
+        assert !edges.contains(c);
+        edges.add(c);
+        assert edges.contains(c);
+    }
+
+    public Group getGroup() {
+        return parent;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Graph " + getName() + " " + getProperties().toString() + "\n");
+        for (InputNode n : nodes.values()) {
+            sb.append(n.toString());
+            sb.append("\n");
+        }
+
+        for (InputEdge c : edges) {
+            sb.append(c.toString());
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
+    public void addBlock(InputBlock b) {
+        blocks.put(b.getName(), b);
+        for (InputNode n : b.getNodes()) {
+            this.nodeToBlock.put(n.getId(), b);
+        }
+    }
+
+    public void resolveBlockLinks() {
+        for (InputBlock b : blocks.values()) {
+            b.resolveBlockLinks();
+        }
+    }
+
+    public void setName(String s) {
+        getProperties().setProperty("name", s);
+    }
+
+    public InputBlock getBlock(String s) {
+        return blocks.get(s);
+    }
+
+    public boolean isDifferenceGraph() {
+        return this.isDifferenceGraph;
+    }
+
+    public void setIsDifferenceGraph(boolean b) {
+        isDifferenceGraph = b;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java
new file mode 100644
index 0000000..eac6b1a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputMethod extends Properties.Object {
+
+    private String name;
+    private int bci;
+    private String shortName;
+    private List<InputMethod> inlined;
+    private InputMethod parentMethod;
+    private Group group;
+    private List<InputBytecode> bytecodes;
+
+    /** Creates a new instance of InputMethod */
+    public InputMethod(Group parent, String name, String shortName, int bci) {
+        this.group = parent;
+        this.name = name;
+        this.bci = bci;
+        this.shortName = shortName;
+        inlined = new ArrayList<InputMethod>();
+        bytecodes = new ArrayList<InputBytecode>();
+    }
+
+    public List<InputBytecode> getBytecodes() {
+        return Collections.unmodifiableList(bytecodes);
+    }
+
+    public List<InputMethod> getInlined() {
+        return Collections.unmodifiableList(inlined);
+    }
+
+    public void addInlined(InputMethod m) {
+
+        // assert bci unique
+        for (InputMethod m2 : inlined) {
+            assert m2.getBci() != m.getBci();
+        }
+
+        inlined.add(m);
+        assert m.parentMethod == null;
+        m.parentMethod = this;
+
+        for (InputBytecode bc : bytecodes) {
+            if (bc.getBci() == m.getBci()) {
+                bc.setInlined(m);
+            }
+        }
+    }
+
+    public Group getGroup() {
+        return group;
+    }
+
+    public String getShortName() {
+        return shortName;
+    }
+
+    public void setBytecodes(String text) {
+
+        String[] strings = text.split("\n");
+        int oldNumber = -1;
+        for (String s : strings) {
+
+            if (s.length() > 0 && Character.isDigit(s.charAt(0))) {
+                s = s.trim();
+                int spaceIndex = s.indexOf(' ');
+                String numberString = s.substring(0, spaceIndex);
+                String tmpName = s.substring(spaceIndex + 1, s.length());
+
+                int number = -1;
+                number = Integer.parseInt(numberString);
+
+                // assert correct order of bytecodes
+                assert number > oldNumber;
+
+                InputBytecode bc = new InputBytecode(number, tmpName);
+                bytecodes.add(bc);
+
+                for (InputMethod m : inlined) {
+                    if (m.getBci() == number) {
+                        bc.setInlined(m);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getBci() {
+        return bci;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java
new file mode 100644
index 0000000..ad15d14
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputNode extends Properties.Object {
+
+    private int id;
+
+    public InputNode(InputNode n) {
+        super(n);
+        setId(n.id);
+    }
+
+    public InputNode(int id) {
+        setId(id);
+    }
+
+    public void setId(int id) {
+        this.id = id;
+        getProperties().setProperty("id", "" + id);
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof InputNode)) {
+            return false;
+        }
+        InputNode n = (InputNode) o;
+        if (n.id != id) {
+            return false;
+        }
+        return getProperties().equals(n.getProperties());
+    }
+
+    @Override
+    public int hashCode() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return "Node " + id + " " + getProperties().toString();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java
new file mode 100644
index 0000000..3becd18
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Pair<L, R> {
+
+    private L l;
+    private R r;
+
+    public Pair() {
+    }
+
+    public Pair(L l, R r) {
+        this.l = l;
+        this.r = r;
+    }
+
+    public L getLeft() {
+        return l;
+    }
+
+    public void setLeft(L l) {
+        this.l = l;
+    }
+
+    public R getRight() {
+        return r;
+    }
+
+    public void setRight(R r) {
+        this.r = r;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof Pair)) {
+            return false;
+        }
+        Pair obj = (Pair) o;
+        return l.equals(obj.l) && r.equals(obj.r);
+    }
+
+    @Override
+    public int hashCode() {
+        return l.hashCode() * 71 + r.hashCode();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java
new file mode 100644
index 0000000..07a2996
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Properties implements Serializable {
+
+    public static final long serialVersionUID = 1L;
+    private Map<String, Property> map;
+
+    public Properties() {
+        map = new HashMap<String, Property>(5);
+    }
+
+    @Override
+    public boolean equals(java.lang.Object o) {
+        if (!(o instanceof Properties)) {
+            return false;
+        }
+
+        Properties p = (Properties) o;
+
+        if (getProperties().size() != p.getProperties().size()) {
+            return false;
+        }
+        for (Property prop : getProperties()) {
+            String value = p.get(prop.getName());
+            if (value == null || !value.equals(prop.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 5;
+        hash = 83 * hash + (this.map != null ? this.map.hashCode() : 0);
+        return hash;
+    }
+
+    public Properties(String name, String value) {
+        this();
+        this.add(new Property(name, value));
+    }
+
+    public Properties(String name, String value, String name1, String value1) {
+        this(name, value);
+        this.add(new Property(name1, value1));
+    }
+
+    public Properties(String name, String value, String name1, String value1, String name2, String value2) {
+        this(name, value, name1, value1);
+        this.add(new Property(name2, value2));
+    }
+
+    public Properties(Properties p) {
+        map = new HashMap<String, Property>(p.map);
+    }
+
+    public static class Object implements Provider {
+
+        private Properties properties;
+
+        public Object() {
+            properties = new Properties();
+        }
+
+        public Object(Properties.Object object) {
+            properties = new Properties(object.getProperties());
+        }
+
+        public Properties getProperties() {
+            return properties;
+        }
+    }
+
+    public interface PropertyMatcher {
+
+        String getName();
+
+        boolean match(String value);
+    }
+
+    public static class InvertPropertyMatcher implements PropertyMatcher {
+
+        private PropertyMatcher matcher;
+
+        public InvertPropertyMatcher(PropertyMatcher matcher) {
+            this.matcher = matcher;
+        }
+
+        public String getName() {
+            return matcher.getName();
+        }
+
+        public boolean match(String p) {
+            return !matcher.match(p);
+        }
+    }
+
+    public static class StringPropertyMatcher implements PropertyMatcher {
+
+        private String name;
+        private String value;
+
+        public StringPropertyMatcher(String name, String value) {
+            this.name = name;
+            this.value = value;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean match(String p) {
+            return p.equals(value);
+        }
+    }
+
+    public static class RegexpPropertyMatcher implements PropertyMatcher {
+
+        private String name;
+        private Pattern valuePattern;
+
+        public RegexpPropertyMatcher(String name, String value) {
+            this.name = name;
+            valuePattern = Pattern.compile(value);
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean match(String p) {
+            Matcher m = valuePattern.matcher(p);
+            return m.matches();
+        }
+    }
+
+    public Property selectSingle(PropertyMatcher matcher) {
+
+        Property p = this.map.get(matcher.getName());
+        if (p == null) {
+            return null;
+        }
+        if (matcher.match(p.getValue())) {
+            return p;
+        } else {
+            return null;
+        }
+    }
+
+    public interface Provider {
+
+        public Properties getProperties();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        for (Property p : map.values()) {
+            sb.append(p.toString());
+        }
+        return sb.append("]").toString();
+    }
+
+    public static class PropertySelector<T extends Properties.Provider> {
+
+        private Collection<T> objects;
+
+        public PropertySelector(Collection<T> objects) {
+            this.objects = objects;
+        }
+
+        public T selectSingle(final String name, final String value) {
+            return selectSingle(new StringPropertyMatcher(name, value));
+        }
+
+        public T selectSingle(PropertyMatcher matcher) {
+
+            for (T t : objects) {
+                Property p = t.getProperties().selectSingle(matcher);
+                if (p != null) {
+                    return t;
+                }
+            }
+
+            return null;
+        }
+
+        public List<T> selectMultiple(final String name, final String value) {
+            return selectMultiple(new StringPropertyMatcher(name, value));
+        }
+
+        public List<T> selectMultiple(PropertyMatcher matcher) {
+            List<T> result = new ArrayList<T>();
+            for (T t : objects) {
+                Property p = t.getProperties().selectSingle(matcher);
+                if (p != null) {
+                    result.add(t);
+                }
+            }
+            return result;
+        }
+    }
+
+    public String get(String key) {
+        Property p = map.get(key);
+        if (p == null) {
+            return null;
+        } else {
+            return p.getValue();
+        }
+    }
+
+    public String getProperty(String string) {
+        return get(string);
+    }
+
+    public Property setProperty(String name, String value) {
+
+        if (value == null) {
+            // remove this property
+            return map.remove(name);
+        } else {
+            Property p = map.get(name);
+            if (p == null) {
+                p = new Property(name, value);
+                map.put(name, p);
+            } else {
+                p.setValue(value);
+            }
+            return p;
+        }
+    }
+
+    public Collection<Property> getProperties() {
+        return Collections.unmodifiableCollection(map.values());
+    }
+
+    public void add(Properties properties) {
+        for (Property p : properties.getProperties()) {
+            add(p);
+        }
+    }
+
+    public void add(Property property) {
+        assert property.getName() != null;
+        assert property.getValue() != null;
+        map.put(property.getName(), property);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java
new file mode 100644
index 0000000..6694153
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Property implements Serializable {
+
+    public static final long serialVersionUID = 1L;
+    private String name;
+    private String value;
+
+    public Property() {
+        this(null, null);
+    }
+
+    public Property(Property p) {
+        this(p.getName(), p.getValue());
+    }
+
+    public Property(String name) {
+        this(name, null);
+    }
+
+    public Property(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setName(String s) {
+        this.name = s;
+    }
+
+    public void setValue(String s) {
+        this.value = s;
+    }
+
+    @Override
+    public String toString() {
+        return name + " = " + value + "; ";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java
new file mode 100644
index 0000000..410ee7c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.HandoverElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ParseMonitor;
+import com.sun.hotspot.igv.data.serialization.XMLParser.TopElementHandler;
+import java.io.IOException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Parser {
+
+    public static final String INDENT = "  ";
+    public static final String TOP_ELEMENT = "graphDocument";
+    public static final String GROUP_ELEMENT = "group";
+    public static final String GRAPH_ELEMENT = "graph";
+    public static final String ROOT_ELEMENT = "graphDocument";
+    public static final String PROPERTIES_ELEMENT = "properties";
+    public static final String EDGES_ELEMENT = "edges";
+    public static final String PROPERTY_ELEMENT = "p";
+    public static final String EDGE_ELEMENT = "edge";
+    public static final String NODE_ELEMENT = "node";
+    public static final String NODES_ELEMENT = "nodes";
+    public static final String REMOVE_EDGE_ELEMENT = "removeEdge";
+    public static final String REMOVE_NODE_ELEMENT = "removeNode";
+    public static final String METHOD_NAME_PROPERTY = "name";
+    public static final String METHOD_IS_PUBLIC_PROPERTY = "public";
+    public static final String METHOD_IS_STATIC_PROPERTY = "static";
+    public static final String TRUE_VALUE = "true";
+    public static final String NODE_NAME_PROPERTY = "name";
+    public static final String EDGE_NAME_PROPERTY = "name";
+    public static final String NODE_ID_PROPERTY = "id";
+    public static final String FROM_PROPERTY = "from";
+    public static final String TO_PROPERTY = "to";
+    public static final String PROPERTY_NAME_PROPERTY = "name";
+    public static final String GRAPH_NAME_PROPERTY = "name";
+    public static final String TO_INDEX_PROPERTY = "index";
+    public static final String METHOD_ELEMENT = "method";
+    public static final String INLINE_ELEMENT = "inline";
+    public static final String BYTECODES_ELEMENT = "bytecodes";
+    public static final String METHOD_BCI_PROPERTY = "bci";
+    public static final String METHOD_SHORT_NAME_PROPERTY = "shortName";
+    public static final String CONTROL_FLOW_ELEMENT = "controlFlow";
+    public static final String BLOCK_NAME_PROPERTY = "name";
+    public static final String BLOCK_ELEMENT = "block";
+    public static final String SUCCESSORS_ELEMENT = "successors";
+    public static final String SUCCESSOR_ELEMENT = "successor";
+    public static final String ASSEMBLY_ELEMENT = "assembly";
+    public static final String DIFFERENCE_PROPERTY = "difference";
+    private TopElementHandler xmlDocument = new TopElementHandler();
+    private boolean difference;
+    private GroupCallback groupCallback;
+    // <graphDocument>
+    private ElementHandler<GraphDocument, Object> topHandler = new ElementHandler<GraphDocument, Object>(TOP_ELEMENT) {
+
+        @Override
+        protected GraphDocument start() throws SAXException {
+            return new GraphDocument();
+        }
+    };
+    // <group>
+    private ElementHandler<Group, GraphDocument> groupHandler = new XMLParser.ElementHandler<Group, GraphDocument>(GROUP_ELEMENT) {
+
+        @Override
+        protected Group start() throws SAXException {
+            Group group = new Group();
+            Parser.this.difference = false;
+            String differenceProperty = this.readAttribute(DIFFERENCE_PROPERTY);
+            if (differenceProperty != null && (differenceProperty.equals("1") || differenceProperty.equals("true"))) {
+                Parser.this.difference = true;
+            }
+
+            ParseMonitor monitor = getMonitor();
+            if (monitor != null) {
+                monitor.setState(group.getName());
+            }
+
+            return group;
+        }
+
+        @Override
+        protected void end(String text) throws SAXException {
+            if (groupCallback == null) {
+                getParentObject().addGroup(getObject());
+            }
+        }
+    };
+    private HandoverElementHandler<Group> assemblyHandler = new XMLParser.HandoverElementHandler<Group>(ASSEMBLY_ELEMENT, true) {
+
+        @Override
+        protected void end(String text) throws SAXException {
+            getParentObject().setAssembly(text);
+        }
+    };
+    // <method>
+    private ElementHandler<InputMethod, Group> methodHandler = new XMLParser.ElementHandler<InputMethod, Group>(METHOD_ELEMENT) {
+
+        @Override
+        protected InputMethod start() throws SAXException {
+
+            InputMethod method = parseMethod(this, getParentObject());
+            getParentObject().setMethod(method);
+            return method;
+        }
+    };
+
+    private InputMethod parseMethod(XMLParser.ElementHandler handler, Group group) throws SAXException {
+        String s = handler.readRequiredAttribute(METHOD_BCI_PROPERTY);
+        int bci = 0;
+        try {
+            bci = Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            throw new SAXException(e);
+        }
+        InputMethod method = new InputMethod(group, handler.readRequiredAttribute(METHOD_NAME_PROPERTY), handler.readRequiredAttribute(METHOD_SHORT_NAME_PROPERTY), bci);
+        return method;
+    }
+    // <bytecodes>
+    private HandoverElementHandler<InputMethod> bytecodesHandler = new XMLParser.HandoverElementHandler<InputMethod>(BYTECODES_ELEMENT, true) {
+
+        @Override
+        protected void end(String text) throws SAXException {
+            getParentObject().setBytecodes(text);
+        }
+    };
+    // <inlined>
+    private HandoverElementHandler<InputMethod> inlinedHandler = new XMLParser.HandoverElementHandler<InputMethod>(INLINE_ELEMENT);
+    // <inlined><method>
+    private ElementHandler<InputMethod, InputMethod> inlinedMethodHandler = new XMLParser.ElementHandler<InputMethod, InputMethod>(METHOD_ELEMENT) {
+
+        @Override
+        protected InputMethod start() throws SAXException {
+            InputMethod method = parseMethod(this, getParentObject().getGroup());
+            getParentObject().addInlined(method);
+            return method;
+        }
+    };
+    // <graph>
+    private ElementHandler<InputGraph, Group> graphHandler = new XMLParser.ElementHandler<InputGraph, Group>(GRAPH_ELEMENT) {
+
+        private InputGraph graph;
+
+        @Override
+        protected InputGraph start() throws SAXException {
+
+            String name = readAttribute(GRAPH_NAME_PROPERTY);
+            InputGraph previous = getParentObject().getLastAdded();
+            if (!difference) {
+                previous = null;
+            }
+            InputGraph curGraph = new InputGraph(getParentObject(), previous, name);
+            getParentObject().addGraph(curGraph);
+            this.graph = curGraph;
+            return curGraph;
+        }
+
+        @Override
+        protected void end(String text) throws SAXException {
+            graph.resolveBlockLinks();
+        }
+    };
+    // <nodes>
+    private HandoverElementHandler<InputGraph> nodesHandler = new HandoverElementHandler<InputGraph>(NODES_ELEMENT);
+    // <controlFlow>
+    private HandoverElementHandler<InputGraph> controlFlowHandler = new HandoverElementHandler<InputGraph>(CONTROL_FLOW_ELEMENT);
+    // <block>
+    private ElementHandler<InputBlock, InputGraph> blockHandler = new ElementHandler<InputBlock, InputGraph>(BLOCK_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            InputGraph graph = getParentObject();
+            String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+            InputBlock b = new InputBlock(getParentObject(), name);
+            graph.addBlock(b);
+            return b;
+        }
+    };
+    // <nodes>
+    private HandoverElementHandler<InputBlock> blockNodesHandler = new HandoverElementHandler<InputBlock>(NODES_ELEMENT);
+    // <node>
+    private ElementHandler<InputBlock, InputBlock> blockNodeHandler = new ElementHandler<InputBlock, InputBlock>(NODE_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            getParentObject().addNode(id);
+            return getParentObject();
+        }
+    };
+    // <successors>
+    private HandoverElementHandler<InputBlock> successorsHandler = new HandoverElementHandler<InputBlock>(SUCCESSORS_ELEMENT);
+    // <successor>
+    private ElementHandler<InputBlock, InputBlock> successorHandler = new ElementHandler<InputBlock, InputBlock>(SUCCESSOR_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+            getParentObject().addSuccessor(name);
+            return getParentObject();
+        }
+    };
+    // <node>
+    private ElementHandler<InputNode, InputGraph> nodeHandler = new ElementHandler<InputNode, InputGraph>(NODE_ELEMENT) {
+
+        @Override
+        protected InputNode start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            InputNode node = new InputNode(id);
+            getParentObject().addNode(node);
+            return node;
+        }
+    };
+    // <removeNode>
+    private ElementHandler<InputNode, InputGraph> removeNodeHandler = new ElementHandler<InputNode, InputGraph>(REMOVE_NODE_ELEMENT) {
+
+        @Override
+        protected InputNode start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            return getParentObject().removeNode(id);
+        }
+    };
+    // <graph>
+    private HandoverElementHandler<InputGraph> edgesHandler = new HandoverElementHandler<InputGraph>(EDGES_ELEMENT);
+
+    // Local class for edge elements
+    private static class EdgeElementHandler extends ElementHandler<InputEdge, InputGraph> {
+
+        public EdgeElementHandler(String name) {
+            super(name);
+        }
+
+        @Override
+        protected InputEdge start() throws SAXException {
+            int toIndex = 0;
+            int from = -1;
+            int to = -1;
+
+            try {
+                String toIndexString = readAttribute(TO_INDEX_PROPERTY);
+                if (toIndexString != null) {
+                    toIndex = Integer.parseInt(toIndexString);
+                }
+
+                from = Integer.parseInt(readRequiredAttribute(FROM_PROPERTY));
+                to = Integer.parseInt(readRequiredAttribute(TO_PROPERTY));
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+
+
+            InputEdge conn = new InputEdge((char) toIndex, from, to);
+            return start(conn);
+        }
+
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            return conn;
+        }
+    }
+    // <edge>
+    private EdgeElementHandler edgeHandler = new EdgeElementHandler(EDGE_ELEMENT) {
+
+        @Override
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            getParentObject().addEdge(conn);
+            return conn;
+        }
+    };
+    // <removeEdge>
+    private EdgeElementHandler removeEdgeHandler = new EdgeElementHandler(REMOVE_EDGE_ELEMENT) {
+
+        @Override
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            getParentObject().removeEdge(conn);
+            return conn;
+        }
+    };
+    // <properties>
+    private HandoverElementHandler<Properties.Provider> propertiesHandler = new HandoverElementHandler<Properties.Provider>(PROPERTIES_ELEMENT);
+    // <properties>
+    private HandoverElementHandler<Group> groupPropertiesHandler = new HandoverElementHandler<Group>(PROPERTIES_ELEMENT) {
+
+        @Override
+        public void end(String text) throws SAXException {
+            if (groupCallback != null) {
+                groupCallback.started(getParentObject());
+            }
+        }
+    };
+    // <property>
+    private ElementHandler<Property, Properties.Provider> propertyHandler = new XMLParser.ElementHandler<Property, Properties.Provider>(PROPERTY_ELEMENT, true) {
+
+        @Override
+        public Property start() throws SAXException {
+            String value = "";
+            String name = readRequiredAttribute(PROPERTY_NAME_PROPERTY).intern();
+            return getParentObject().getProperties().setProperty(name, value);
+        }
+
+        @Override
+        public void end(String text) {
+            getObject().setValue(text.trim().intern());
+        }
+    };
+
+    public Parser() {
+        this(null);
+    }
+
+    public Parser(GroupCallback groupCallback) {
+
+        this.groupCallback = groupCallback;
+
+        // Initialize dependencies
+        xmlDocument.addChild(topHandler);
+        topHandler.addChild(groupHandler);
+
+        groupHandler.addChild(methodHandler);
+        groupHandler.addChild(assemblyHandler);
+        groupHandler.addChild(graphHandler);
+
+        methodHandler.addChild(inlinedHandler);
+        methodHandler.addChild(bytecodesHandler);
+
+        inlinedHandler.addChild(inlinedMethodHandler);
+        inlinedMethodHandler.addChild(bytecodesHandler);
+        inlinedMethodHandler.addChild(inlinedHandler);
+
+        graphHandler.addChild(nodesHandler);
+        graphHandler.addChild(edgesHandler);
+        graphHandler.addChild(controlFlowHandler);
+
+        controlFlowHandler.addChild(blockHandler);
+
+        blockHandler.addChild(successorsHandler);
+        successorsHandler.addChild(successorHandler);
+        blockHandler.addChild(blockNodesHandler);
+        blockNodesHandler.addChild(blockNodeHandler);
+
+        nodesHandler.addChild(nodeHandler);
+        nodesHandler.addChild(removeNodeHandler);
+        edgesHandler.addChild(edgeHandler);
+        edgesHandler.addChild(removeEdgeHandler);
+
+        methodHandler.addChild(propertiesHandler);
+        inlinedMethodHandler.addChild(propertiesHandler);
+        topHandler.addChild(propertiesHandler);
+        groupHandler.addChild(groupPropertiesHandler);
+        graphHandler.addChild(propertiesHandler);
+        nodeHandler.addChild(propertiesHandler);
+        propertiesHandler.addChild(propertyHandler);
+        groupPropertiesHandler.addChild(propertyHandler);
+    }
+
+    // Returns a new GraphDocument object deserialized from an XML input source.
+    public GraphDocument parse(XMLReader reader, InputSource source, XMLParser.ParseMonitor monitor) throws SAXException {
+        reader.setContentHandler(new XMLParser(xmlDocument, monitor));
+        try {
+            reader.parse(source);
+        } catch (IOException ex) {
+            throw new SAXException(ex);
+        }
+
+        return topHandler.getObject();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java
new file mode 100644
index 0000000..c5b794f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Printer {
+
+    public void export(Writer writer, GraphDocument document) {
+
+        XMLWriter xmlWriter = new XMLWriter(writer);
+
+        try {
+            export(xmlWriter, document);
+        } catch (IOException ex) {
+        }
+    }
+
+    private void export(XMLWriter xmlWriter, GraphDocument document) throws IOException {
+        xmlWriter.startTag(Parser.ROOT_ELEMENT);
+        xmlWriter.writeProperties(document.getProperties());
+        for (Group g : document.getGroups()) {
+            export(xmlWriter, g);
+        }
+
+        xmlWriter.endTag();
+        xmlWriter.flush();
+    }
+
+    private void export(XMLWriter writer, Group g) throws IOException {
+        Properties attributes = new Properties();
+        attributes.add(new Property("difference", Boolean.toString(true)));
+        writer.startTag(Parser.GROUP_ELEMENT, attributes);
+        writer.writeProperties(g.getProperties());
+
+        if (g.getMethod() != null) {
+            export(writer, g.getMethod());
+        }
+
+        InputGraph previous = null;
+        for (InputGraph graph : g.getGraphs()) {
+            export(writer, graph, previous, true);
+            previous = graph;
+        }
+
+        writer.endTag();
+    }
+
+    public void export(XMLWriter writer, InputGraph graph, InputGraph previous, boolean difference) throws IOException {
+
+        writer.startTag(Parser.GRAPH_ELEMENT);
+        writer.writeProperties(graph.getProperties());
+        writer.startTag(Parser.NODES_ELEMENT);
+
+        Set<InputNode> removed = new HashSet<InputNode>();
+        Set<InputNode> equal = new HashSet<InputNode>();
+
+        if (previous != null) {
+            for (InputNode n : previous.getNodes()) {
+                int id = n.getId();
+                InputNode n2 = graph.getNode(id);
+                if (n2 == null) {
+                    removed.add(n);
+                } else if (n.equals(n2)) {
+                    equal.add(n);
+                }
+            }
+        }
+
+        if (difference) {
+            for (InputNode n : removed) {
+                writer.simpleTag(Parser.REMOVE_NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+            }
+        }
+
+        for (InputNode n : graph.getNodes()) {
+            if (!difference || !equal.contains(n)) {
+                writer.startTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+                writer.writeProperties(n.getProperties());
+                writer.endTag();
+            }
+        }
+
+        writer.endTag();
+
+        writer.startTag(Parser.EDGES_ELEMENT);
+        Set<InputEdge> removedEdges = new HashSet<InputEdge>();
+        Set<InputEdge> equalEdges = new HashSet<InputEdge>();
+
+        if (previous != null) {
+            for (InputEdge e : previous.getEdges()) {
+                if (graph.getEdges().contains(e)) {
+                    equalEdges.add(e);
+                } else {
+                    removedEdges.add(e);
+                }
+            }
+        }
+
+        if (difference) {
+            for (InputEdge e : removedEdges) {
+                writer.simpleTag(Parser.REMOVE_EDGE_ELEMENT, createProperties(e));
+            }
+        }
+
+        for (InputEdge e : graph.getEdges()) {
+            if (!difference || !equalEdges.contains(e)) {
+                if (!equalEdges.contains(e)) {
+                    writer.simpleTag(Parser.EDGE_ELEMENT, createProperties(e));
+                }
+            }
+        }
+
+        writer.endTag();
+
+        writer.startTag(Parser.CONTROL_FLOW_ELEMENT);
+        for (InputBlock b : graph.getBlocks()) {
+
+            writer.startTag(Parser.BLOCK_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, b.getName()));
+
+            writer.startTag(Parser.SUCCESSORS_ELEMENT);
+            for (InputBlock s : b.getSuccessors()) {
+                writer.simpleTag(Parser.SUCCESSOR_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, s.getName()));
+            }
+            writer.endTag();
+
+            writer.startTag(Parser.NODES_ELEMENT);
+            for (InputNode n : b.getNodes()) {
+                writer.simpleTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, n.getId() + ""));
+            }
+            writer.endTag();
+
+            writer.endTag();
+
+        }
+
+        writer.endTag();
+        writer.endTag();
+    }
+
+    private void export(XMLWriter w, InputMethod method) throws IOException {
+
+        w.startTag(Parser.METHOD_ELEMENT, new Properties(Parser.METHOD_BCI_PROPERTY, method.getBci() + "", Parser.METHOD_NAME_PROPERTY, method.getName(), Parser.METHOD_SHORT_NAME_PROPERTY, method.getShortName()));
+
+        w.writeProperties(method.getProperties());
+
+        if (method.getInlined().size() > 0) {
+            w.startTag(Parser.INLINE_ELEMENT);
+            for (InputMethod m : method.getInlined()) {
+                export(w, m);
+            }
+            w.endTag();
+        }
+
+        w.startTag(Parser.BYTECODES_ELEMENT);
+
+        StringBuilder b = new StringBuilder();
+        b.append("<![CDATA[\n");
+        for (InputBytecode code : method.getBytecodes()) {
+            b.append(code.getBci());
+            b.append(" ");
+            b.append(code.getName());
+            b.append("\n");
+
+        }
+        b.append("]]>");
+        w.write(b.toString());
+        w.endTag();
+        w.endTag();
+    }
+
+    private Properties createProperties(InputEdge edge) {
+        Properties p = new Properties();
+        p.setProperty(Parser.TO_INDEX_PROPERTY, Integer.toString(edge.getToIndex()));
+        p.setProperty(Parser.TO_PROPERTY, Integer.toString(edge.getTo()));
+        p.setProperty(Parser.FROM_PROPERTY, Integer.toString(edge.getFrom()));
+        return p;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java
new file mode 100644
index 0000000..1efcd06
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Hashtable;
+import java.util.Stack;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLParser implements ContentHandler {
+
+    public static interface ParseMonitor {
+
+        public void setProgress(double d);
+
+        public void setState(String state);
+    }
+
+    public static class MissingAttributeException extends SAXException {
+
+        private String name;
+
+        public MissingAttributeException(String name) {
+            super("Missing attribute \"" + name + "\"");
+            this.name = name;
+        }
+
+        public String getAttributeName() {
+            return this.getMessage();
+        }
+    }
+
+    public static class HandoverElementHandler<P> extends ElementHandler<P, P> {
+
+        @Override
+        protected P start() throws SAXException {
+            return getParentObject();
+        }
+
+        public HandoverElementHandler(String name) {
+            super(name);
+        }
+
+        public HandoverElementHandler(String name, boolean needsText) {
+            super(name, needsText);
+        }
+    }
+
+    public static class TopElementHandler<P> extends ElementHandler<P, Object> {
+
+        public TopElementHandler() {
+            super(null);
+        }
+    }
+
+    public static class ElementHandler<T, P> {
+
+        private String name;
+        private T object;
+        private Attributes attr;
+        private StringBuilder currentText;
+        private ParseMonitor monitor;
+        private Hashtable<String, ElementHandler<?, ? super T>> hashtable;
+        private boolean needsText;
+        private ElementHandler<P, ?> parentElement;
+
+        public ElementHandler(String name) {
+            this(name, false);
+        }
+
+        public ElementHandler<P, ?> getParentElement() {
+            return parentElement;
+        }
+
+        public P getParentObject() {
+            return getParentElement().getObject();
+        }
+
+        protected boolean needsText() {
+            return needsText;
+        }
+
+        public ElementHandler(String name, boolean needsText) {
+            this.hashtable = new Hashtable<String, ElementHandler<?, ? super T>>();
+            this.name = name;
+            this.needsText = needsText;
+        }
+
+        public ParseMonitor getMonitor() {
+            return monitor;
+        }
+
+        public ElementHandler<?, ? super T> getChild(String name) {
+            return hashtable.get(name);
+        }
+
+        public void addChild(ElementHandler<?, ? super T> handler) {
+            assert handler != null;
+            hashtable.put(handler.getName(), handler);
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public T getObject() {
+            return object;
+        }
+
+        public String readAttribute(String name) {
+            return attr.getValue(name);
+        }
+
+        public String readRequiredAttribute(String name) throws SAXException {
+            String s = readAttribute(name);
+            if (s == null) {
+                throw new MissingAttributeException(name);
+            }
+            return s;
+        }
+
+        public void processAttributesAsProperties(Properties p) {
+            int length = attr.getLength();
+            for (int i = 0; i < length; i++) {
+                String val = attr.getValue(i).intern();
+                String localName = attr.getLocalName(i).intern();
+                p.add(new Property(val, localName));
+            }
+        }
+
+        public void startElement(ElementHandler<P, ?> parentElement, Attributes attr, ParseMonitor monitor) throws SAXException {
+            this.currentText = new StringBuilder();
+            this.attr = attr;
+            this.monitor = monitor;
+            this.parentElement = parentElement;
+            object = start();
+        }
+
+        protected T start() throws SAXException {
+            return null;
+        }
+
+        protected void end(String text) throws SAXException {
+
+        }
+
+        public void endElement() throws SAXException {
+            end(currentText.toString());
+        }
+
+        protected void text(char[] c, int start, int length) {
+            assert currentText != null;
+            currentText.append(c, start, length);
+        }
+    }
+    private Stack<ElementHandler> stack;
+    private ParseMonitor monitor;
+
+    public XMLParser(TopElementHandler rootHandler, ParseMonitor monitor) {
+        this.stack = new Stack<ElementHandler>();
+        this.monitor = monitor;
+        this.stack.push(rootHandler);
+    }
+
+    public void setDocumentLocator(Locator locator) {
+        if (monitor != null) {
+            monitor.setState("Starting parsing");
+        }
+    }
+
+    public void startDocument() throws SAXException {
+    }
+
+    public void endDocument() throws SAXException {
+    }
+
+    public void startPrefixMapping(String prefix, String uri) throws SAXException {
+    }
+
+    public void endPrefixMapping(String prefix) throws SAXException {
+    }
+
+    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+        assert !stack.isEmpty();
+        ElementHandler parent = stack.peek();
+        if (parent != null) {
+            ElementHandler child = parent.getChild(qName);
+            if (child != null) {
+                child.startElement(parent, atts, monitor);
+                stack.push(child);
+                return;
+            }
+        }
+
+        stack.push(null);
+    }
+
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        ElementHandler handler = stack.pop();
+        if (handler != null) {
+            handler.endElement();
+        }
+    }
+
+    public void characters(char[] ch, int start, int length) throws SAXException {
+
+        assert !stack.isEmpty();
+
+
+        ElementHandler top = stack.peek();
+        if (top != null && top.needsText()) {
+            top.text(ch, start, length);
+        }
+    }
+
+    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+    }
+
+    public void processingInstruction(String target, String data) throws SAXException {
+    }
+
+    public void skippedEntity(String name) throws SAXException {
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java
new file mode 100644
index 0000000..e112dbf4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Stack;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLWriter extends Writer {
+
+    private Writer inner;
+    private Stack<String> elementStack;
+
+    public XMLWriter(Writer inner) {
+        this.inner = inner;
+        elementStack = new Stack<String>();
+    }
+
+    @Override
+    public void write(char[] arr) throws IOException {
+        write(arr, 0, arr.length);
+    }
+
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        for (int i = off; i < off + len; i++) {
+            char c = cbuf[i];
+            if (c == '>') {
+                inner.write("&gt;");
+            } else if (c == '<') {
+                inner.write("&lt;");
+            } else if (c == '&') {
+                inner.write("&amp;");
+            } else {
+                inner.write(c);
+            }
+        }
+    }
+
+    public void flush() throws IOException {
+        inner.flush();
+    }
+
+    public void close() throws IOException {
+        inner.close();
+    }
+
+    public void endTag() throws IOException {
+        inner.write("</" + elementStack.pop() + ">\n");
+    }
+
+    public void startTag(String name) throws IOException {
+        inner.write("<" + name + ">\n");
+        elementStack.push(name);
+    }
+
+    public void simpleTag(String name) throws IOException {
+        inner.write("<" + name + "/>\n");
+    }
+
+    public void startTag(String name, Properties attributes) throws IOException {
+        inner.write("<" + name);
+        elementStack.push(name);
+
+        for (Property p : attributes.getProperties()) {
+            inner.write(" " + p.getName() + "=\"");
+            write(p.getValue().toCharArray());
+            inner.write("\"");
+        }
+
+        inner.write(">\n");
+    }
+
+    public void simpleTag(String name, Properties attributes) throws IOException {
+        inner.write("<" + name);
+
+        for (Property p : attributes.getProperties()) {
+            inner.write(" " + p.getName() + "=\"");
+            write(p.getValue().toCharArray());
+            inner.write("\"");
+        }
+
+        inner.write("/>\n");
+    }
+
+    public void writeProperties(Properties props) throws IOException {
+        if (props.getProperties().size() == 0) {
+            return;
+        }
+
+        startTag(Parser.PROPERTIES_ELEMENT);
+
+        for (Property p : props.getProperties()) {
+            startTag(Parser.PROPERTY_ELEMENT, new Properties(Parser.PROPERTY_NAME_PROPERTY, p.getName()));
+            this.write(p.getValue().toCharArray());
+            endTag();
+        }
+
+        endTag();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java
new file mode 100644
index 0000000..153221d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GraphViewer {
+
+    public void view(InputGraph graph);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java
new file mode 100644
index 0000000..8b0115e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupCallback {
+
+    public void started(Group g);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java
new file mode 100644
index 0000000..90d61eb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupOrganizer {
+
+    public String getName();
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java
new file mode 100644
index 0000000..8b730c3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import java.awt.Component;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupReceiver {
+
+    public Component init(GroupCallback callback);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java
new file mode 100644
index 0000000..0006ec5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface InputGraphProvider {
+
+    InputGraph getGraph();
+
+    void setSelectedNodes(Set<InputNode> nodes);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java
new file mode 100644
index 0000000..18207df
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import java.util.Collection;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Scheduler {
+
+    public Collection<InputBlock> schedule(InputGraph graph);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml
new file mode 100644
index 0000000..bc11fd9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.difference" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.difference.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf
new file mode 100644
index 0000000..febe224
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.difference

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/difference/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml
new file mode 100644
index 0000000..1c1b96a9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.difference-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties
new file mode 100644
index 0000000..1c01a07
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1657ecfe
+build.xml.script.CRC32=03909051
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1657ecfe
+nbproject/build-impl.xml.script.CRC32=2208e770
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml
new file mode 100644
index 0000000..1225db6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.difference</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties
new file mode 100644
index 0000000..5c4d7e1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=Difference
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java
new file mode 100644
index 0000000..335344e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.difference;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Property;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Difference {
+
+    public static final String PROPERTY_STATE = "state";
+    public static final String VALUE_NEW = "new";
+    public static final String VALUE_CHANGED = "changed";
+    public static final String VALUE_SAME = "same";
+    public static final String VALUE_DELETED = "deleted";
+    public static final String OLD_PREFIX = "OLD_";
+    public static final String MAIN_PROPERTY = "name";
+    public static final double LIMIT = 100.0;
+    public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"};
+
+    public static InputGraph createDiffGraph(InputGraph a, InputGraph b) {
+        if (a.getGroup() == b.getGroup()) {
+            return createDiffSameGroup(a, b);
+        } else {
+            return createDiff(a, b);
+        }
+    }
+
+    private static InputGraph createDiffSameGroup(InputGraph a, InputGraph b) {
+        Map<Integer, InputNode> keyMapB = new HashMap<Integer, InputNode>();
+        for (InputNode n : b.getNodes()) {
+            Integer key = n.getId();
+            assert !keyMapB.containsKey(key);
+            keyMapB.put(key, n);
+        }
+
+        Set<Pair> pairs = new HashSet<Pair>();
+
+        for (InputNode n : a.getNodes()) {
+            Integer key = n.getId();
+
+
+            if (keyMapB.containsKey(key)) {
+                InputNode nB = keyMapB.get(key);
+                pairs.add(new Pair(n, nB));
+            }
+        }
+
+        return createDiff(a, b, pairs);
+    }
+
+    private static InputGraph createDiff(InputGraph a, InputGraph b, Set<Pair> pairs) {
+        Group g = new Group();
+        g.setMethod(a.getGroup().getMethod());
+        g.setAssembly(a.getGroup().getAssembly());
+        g.getProperties().setProperty("name", "Difference");
+        InputGraph graph = new InputGraph(g, null);
+        graph.setName(a.getName() + ", " + b.getName());
+        graph.setIsDifferenceGraph(true);
+
+        Set<InputNode> nodesA = new HashSet<InputNode>(a.getNodes());
+        Set<InputNode> nodesB = new HashSet<InputNode>(b.getNodes());
+
+        Map<InputNode, InputNode> inputNodeMap = new HashMap<InputNode, InputNode>();
+        for (Pair p : pairs) {
+            InputNode n = p.getN1();
+            assert nodesA.contains(n);
+            InputNode nB = p.getN2();
+            assert nodesB.contains(nB);
+
+            nodesA.remove(n);
+            nodesB.remove(nB);
+            InputNode n2 = new InputNode(n);
+            inputNodeMap.put(n, n2);
+            inputNodeMap.put(nB, n2);
+            graph.addNode(n2);
+            markAsChanged(n2, n, nB);
+        }
+
+        for (InputNode n : nodesA) {
+            InputNode n2 = new InputNode(n);
+            graph.addNode(n2);
+            markAsNew(n2);
+            inputNodeMap.put(n, n2);
+        }
+
+        for (InputNode n : nodesB) {
+            InputNode n2 = new InputNode(n);
+            n2.setId(-n2.getId());
+            graph.addNode(n2);
+            markAsDeleted(n2);
+            inputNodeMap.put(n, n2);
+        }
+
+        Set<InputEdge> edgesA = a.getEdges();
+        Set<InputEdge> edgesB = b.getEdges();
+
+        Set<InputEdge> newEdges = new HashSet<InputEdge>();
+
+        for (InputEdge e : edgesA) {
+            int from = e.getFrom();
+            int to = e.getTo();
+            InputNode nodeFrom = inputNodeMap.get(a.getNode(from));
+            InputNode nodeTo = inputNodeMap.get(a.getNode(to));
+            char index = e.getToIndex();
+
+            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+            if (!newEdges.contains(newEdge)) {
+                markAsNew(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            }
+        }
+
+        for (InputEdge e : edgesB) {
+            int from = e.getFrom();
+            int to = e.getTo();
+            InputNode nodeFrom = inputNodeMap.get(b.getNode(from));
+            InputNode nodeTo = inputNodeMap.get(b.getNode(to));
+            char index = e.getToIndex();
+
+            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+            if (!newEdges.contains(newEdge)) {
+                markAsDeleted(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            } else {
+                newEdges.remove(newEdge);
+                graph.removeEdge(newEdge);
+                markAsSame(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            }
+        }
+
+        g.addGraph(graph);
+        return graph;
+    }
+
+    private static class Pair {
+
+        private InputNode n1;
+        private InputNode n2;
+
+        public Pair(InputNode n1, InputNode n2) {
+            this.n1 = n1;
+            this.n2 = n2;
+        }
+
+        public double getValue() {
+
+            double result = 0.0;
+            for (Property p : n1.getProperties().getProperties()) {
+                double faktor = 1.0;
+                for (String forbidden : IGNORE_PROPERTIES) {
+                    if (p.getName().equals(forbidden)) {
+                        faktor = 0.1;
+                        break;
+                    }
+                }
+                String p2 = n2.getProperties().get(p.getName());
+                result += evaluate(p.getValue(), p2) * faktor;
+            }
+
+            return result;
+        }
+
+        private double evaluate(String p, String p2) {
+            if (p2 == null) {
+                return 1.0;
+            }
+            if (p.equals(p2)) {
+                return 0.0;
+            } else {
+                return (double) (Math.abs(p.length() - p2.length())) / p.length() + 0.5;
+            }
+        }
+
+        public InputNode getN1() {
+            return n1;
+        }
+
+        public InputNode getN2() {
+            return n2;
+        }
+    }
+
+    private static InputGraph createDiff(InputGraph a, InputGraph b) {
+
+        Set<InputNode> matched = new HashSet<InputNode>();
+
+        Set<Pair> pairs = new HashSet<Pair>();
+        for (InputNode n : a.getNodes()) {
+            String s = n.getProperties().get(MAIN_PROPERTY);
+            if (s == null) {
+                s = "";
+            }
+            for (InputNode n2 : b.getNodes()) {
+                String s2 = n2.getProperties().get(MAIN_PROPERTY);
+                if (s2 == null) {
+                    s2 = "";
+                }
+
+                if (s.equals(s2)) {
+                    Pair p = new Pair(n, n2);
+                    pairs.add(p);
+                }
+            }
+        }
+
+        Set<Pair> selectedPairs = new HashSet<Pair>();
+        while (pairs.size() > 0) {
+
+            double min = Double.MAX_VALUE;
+            Pair minPair = null;
+            for (Pair p : pairs) {
+                double cur = p.getValue();
+                if (cur < min) {
+                    minPair = p;
+                    min = cur;
+                }
+            }
+
+            if (min > LIMIT) {
+                break;
+            } else {
+                selectedPairs.add(minPair);
+
+                Set<Pair> toRemove = new HashSet<Pair>();
+                for (Pair p : pairs) {
+                    if (p.getN1() == minPair.getN1() || p.getN2() == minPair.getN2()) {
+                        toRemove.add(p);
+                    }
+                }
+                pairs.removeAll(toRemove);
+            }
+        }
+
+        return createDiff(a, b, selectedPairs);
+    }
+
+    private static void markAsNew(InputEdge e) {
+        e.setState(InputEdge.State.NEW);
+    }
+
+    private static void markAsDeleted(InputEdge e) {
+        e.setState(InputEdge.State.DELETED);
+
+    }
+
+    private static void markAsSame(InputEdge e) {
+        e.setState(InputEdge.State.SAME);
+    }
+
+    private static void markAsChanged(InputNode n, InputNode firstNode, InputNode otherNode) {
+
+        boolean difference = false;
+        for (Property p : otherNode.getProperties().getProperties()) {
+            String s = firstNode.getProperties().getProperty(p.getName());
+            if (!p.getValue().equals(s)) {
+                difference = true;
+                n.getProperties().add(new Property(OLD_PREFIX + p.getName(), p.getValue()));
+            }
+        }
+
+        for (Property p : firstNode.getProperties().getProperties()) {
+            String s = otherNode.getProperties().getProperty(p.getName());
+            if (s == null && p.getValue().length() > 0) {
+                difference = true;
+                n.getProperties().add(new Property(OLD_PREFIX + p.getName(), ""));
+            }
+        }
+
+        if (difference) {
+            n.getProperties().add(new Property(PROPERTY_STATE, VALUE_CHANGED));
+        } else {
+            n.getProperties().add(new Property(PROPERTY_STATE, VALUE_SAME));
+        }
+    }
+
+    private static void markAsDeleted(InputNode n) {
+        n.getProperties().add(new Property(PROPERTY_STATE, VALUE_DELETED));
+    }
+
+    private static void markAsNew(InputNode n) {
+        n.getProperties().add(new Property(PROPERTY_STATE, VALUE_NEW));
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml
new file mode 100644
index 0000000..2182f70
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filter" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.filter.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf
new file mode 100644
index 0000000..185ff36
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.filter

+OpenIDE-Module-Layer: com/sun/hotspot/igv/filter/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filter/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml
new file mode 100644
index 0000000..363a56c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.filter-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties
new file mode 100644
index 0000000..0b45838
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=7c032ebf
+build.xml.script.CRC32=3b022a25
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=7c032ebf
+nbproject/build-impl.xml.script.CRC32=26513f91
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml
new file mode 100644
index 0000000..31414d5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.filter</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction
new file mode 100644
index 0000000..4ebfb45
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction
@@ -0,0 +1 @@
+com.sun.hotspot.igv.filter.JavaSE6ScriptEngine
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java
new file mode 100644
index 0000000..d015e64
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.Properties;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class AbstractFilter implements Filter {
+
+    private ChangedEvent<Filter> changedEvent;
+    private Properties properties;
+
+    public AbstractFilter() {
+        changedEvent = new ChangedEvent<Filter>(this);
+        properties = new Properties();
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public OpenCookie getEditor() {
+        return null;
+    }
+
+    public ChangedEvent<Filter> getChangedEvent() {
+        return changedEvent;
+    }
+
+    protected void fireChangedEvent() {
+        changedEvent.fire();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties
new file mode 100644
index 0000000..cd43cb8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties
@@ -0,0 +1,11 @@
+OpenIDE-Module-Name=Filter
+
+jLabel1.text=Name\:
+jLabel2.text=Source\:
+
+nameTextField.text=
+
+jButton1.text=OK
+jButton2.text=Cancel
+
+title=Edit Filter Dialog
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java
new file mode 100644
index 0000000..f0dd2ca
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Connection.ConnectionStyle;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorFilter extends AbstractFilter {
+
+    private List<ColorRule> colorRules;
+    private String name;
+
+    public ColorFilter(String name) {
+        this.name = name;
+        colorRules = new ArrayList<ColorRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (ColorRule rule : colorRules) {
+            if (rule.getSelector() != null) {
+                List<Figure> figures = rule.getSelector().selected(diagram);
+                for (Figure f : figures) {
+                    applyRule(rule, f);
+                    if (rule.getColor() != null) {
+                        f.setColor(rule.getColor());
+                    }
+                }
+            } else {
+                for (Figure f : diagram.getFigures()) {
+                    applyRule(rule, f);
+                }
+            }
+        }
+    }
+
+    private void applyRule(ColorRule rule, Figure f) {
+        if (rule.getColor() != null) {
+            f.setColor(rule.getColor());
+        }
+        Color color = rule.getLineColor();
+        ConnectionStyle style = rule.getLineStyle();
+
+        for (OutputSlot s : f.getOutputSlots()) {
+            for (Connection c : s.getConnections()) {
+                if (color != null) {
+                    c.setColor(color);
+                }
+
+                if (style != null) {
+                    c.setStyle(style);
+                }
+            }
+        }
+    }
+
+    public void addRule(ColorRule r) {
+        colorRules.add(r);
+    }
+
+    public static class ColorRule {
+
+        private Color color;
+        private Color lineColor;
+        private Connection.ConnectionStyle lineStyle;
+        private Selector selector;
+
+        public ColorRule(Selector selector, Color c) {
+            this(selector, c, null, null);
+        }
+
+        public ColorRule(Selector selector, Color c, Color lineColor, Connection.ConnectionStyle lineStyle) {
+            this.selector = selector;
+            this.color = c;
+            this.lineColor = lineColor;
+            this.lineStyle = lineStyle;
+
+        }
+
+        public ColorRule(Color c) {
+            this(null, c);
+        }
+
+        public Color getColor() {
+            return color;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public Color getLineColor() {
+            return lineColor;
+        }
+
+        public Connection.ConnectionStyle getLineStyle() {
+            return lineStyle;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java
new file mode 100644
index 0000000..613ca15
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CombineFilter extends AbstractFilter {
+
+    private List<CombineRule> rules;
+    private String name;
+
+    public CombineFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<CombineRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (CombineRule r : rules) {
+
+            List<Figure> list = selector.selectMultiple(r.getFirstMatcher());
+            Set<Figure> figuresToRemove = new HashSet<Figure>();
+            for (Figure f : list) {
+
+                List<Figure> successors = new ArrayList<Figure>(f.getSuccessors());
+                if (r.isReversed()) {
+                    if (successors.size() == 1) {
+                        Figure succ = successors.get(0);
+                        InputSlot slot = null;
+
+                        for (InputSlot s : succ.getInputSlots()) {
+                            for (Connection c : s.getConnections()) {
+                                if (c.getOutputSlot().getFigure() == f) {
+                                    slot = s;
+                                }
+                            }
+                        }
+
+                        assert slot != null;
+                        slot.setName(f.getProperties().get("dump_spec"));
+                        if (f.getProperties().get("short_name") != null) {
+                            slot.setShortName(f.getProperties().get("short_name"));
+                        } else {
+                            String s = f.getProperties().get("dump_spec");
+                            if (s != null && s.length() <= 5) {
+                                slot.setShortName(s);
+                            }
+
+                        }
+
+                        for (InputSlot s : f.getInputSlots()) {
+                            for (Connection c : s.getConnections()) {
+                                Connection newConn = diagram.createConnection(slot, c.getOutputSlot());
+                                newConn.setColor(c.getColor());
+                                newConn.setStyle(c.getStyle());
+                            }
+                        }
+
+                        figuresToRemove.add(f);
+                    }
+                } else {
+
+                    for (Figure succ : successors) {
+                        if (succ.getPredecessors().size() == 1) {
+                            if (succ.getProperties().selectSingle(r.getSecondMatcher()) != null && succ.getOutputSlots().size() == 1) {
+
+
+                                OutputSlot oldSlot = null;
+                                for (OutputSlot s : f.getOutputSlots()) {
+                                    for (Connection c : s.getConnections()) {
+                                        if (c.getInputSlot().getFigure() == succ) {
+                                            oldSlot = s;
+                                        }
+                                    }
+                                }
+
+                                assert oldSlot != null;
+
+                                OutputSlot nextSlot = succ.getOutputSlots().get(0);
+                                int pos = 0;
+                                if (succ.getProperties().get("con") != null) {
+                                    pos = Integer.parseInt(succ.getProperties().get("con"));
+                                }
+                                OutputSlot slot = f.createOutputSlot(pos);
+                                slot.setName(succ.getProperties().get("dump_spec"));
+                                if (succ.getProperties().get("short_name") != null) {
+                                    slot.setShortName(succ.getProperties().get("short_name"));
+                                } else {
+                                    String s = succ.getProperties().get("dump_spec");
+                                    if (s != null && s.length() <= 2) {
+                                        slot.setShortName(s);
+                                    } else {
+                                        String tmpName = succ.getProperties().get("name");
+                                        if (tmpName != null && tmpName.length() > 0) {
+                                            slot.setShortName(tmpName.substring(0, 1));
+                                        }
+                                    }
+                                }
+                                for (Connection c : nextSlot.getConnections()) {
+                                    Connection newConn = diagram.createConnection(c.getInputSlot(), slot);
+                                    newConn.setColor(c.getColor());
+                                    newConn.setStyle(c.getStyle());
+                                }
+
+
+                                figuresToRemove.add(succ);
+
+                                if (oldSlot.getConnections().size() == 0) {
+                                    f.removeSlot(oldSlot);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            diagram.removeAllFigures(figuresToRemove);
+        }
+    }
+
+    public void addRule(CombineRule combineRule) {
+        rules.add(combineRule);
+    }
+
+    public static class CombineRule {
+
+        private PropertyMatcher first;
+        private PropertyMatcher second;
+        private boolean reversed;
+
+        public CombineRule(PropertyMatcher first, PropertyMatcher second) {
+            this(first, second, false);
+
+        }
+
+        public CombineRule(PropertyMatcher first, PropertyMatcher second, boolean reversed) {
+            this.first = first;
+            this.second = second;
+            this.reversed = reversed;
+        }
+
+        public boolean isReversed() {
+            return reversed;
+        }
+
+        public PropertyMatcher getFirstMatcher() {
+            return first;
+        }
+
+        public PropertyMatcher getSecondMatcher() {
+            return second;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java
new file mode 100644
index 0000000..d405791
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionFilter extends AbstractFilter {
+
+    private List<ConnectionStyleRule> connectionStyleRules;
+    private String name;
+
+    public ConnectionFilter(String name) {
+        this.name = name;
+        connectionStyleRules = new ArrayList<ConnectionStyleRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (ConnectionStyleRule rule : connectionStyleRules) {
+            List<Figure> figures = null;
+            if (rule.getSelector() != null) {
+                figures = rule.getSelector().selected(diagram);
+            } else {
+                figures = diagram.getFigures();
+            }
+
+            for (Figure f : figures) {
+                for (OutputSlot os : f.getOutputSlots()) {
+                    for (Connection c : os.getConnections()) {
+                        if (figures.contains(c.getInputSlot().getFigure())) {
+                            c.setStyle(rule.getLineStyle());
+                            c.setColor(rule.getLineColor());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void addRule(ConnectionStyleRule r) {
+        connectionStyleRules.add(r);
+    }
+
+    public static class ConnectionStyleRule {
+
+        private Color lineColor;
+        private Connection.ConnectionStyle lineStyle;
+        private Selector selector;
+
+        public ConnectionStyleRule(Selector selector, Color lineColor, Connection.ConnectionStyle lineStyle) {
+            this.selector = selector;
+            this.lineColor = lineColor;
+            this.lineStyle = lineStyle;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public Color getLineColor() {
+            return lineColor;
+        }
+
+        public Connection.ConnectionStyle getLineStyle() {
+            return lineStyle;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java
new file mode 100644
index 0000000..762d8d2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.Property;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.cookies.OpenCookie;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CustomFilter extends AbstractFilter {
+
+    public static final String JAVASCRIPT_HELPER_ID = "JavaScriptHelper";
+    private static ScriptEngineAbstraction engine;
+    private String code;
+    private String name;
+
+    public CustomFilter(String name, String code) {
+        this.name = name;
+        this.code = code;
+        getProperties().add(new Property("name", name));
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setName(String s) {
+        name = s;
+        fireChangedEvent();
+    }
+
+    public void setCode(String s) {
+        code = s;
+        fireChangedEvent();
+    }
+
+    @Override
+    public OpenCookie getEditor() {
+        return new OpenCookie() {
+
+            public void open() {
+                openInEditor();
+            }
+        };
+    }
+
+    public boolean openInEditor() {
+        EditFilterDialog dialog = new EditFilterDialog(CustomFilter.this);
+        dialog.setVisible(true);
+        return dialog.wasAccepted();
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+
+    public static ScriptEngineAbstraction getEngine() {
+        if (engine == null) {
+
+            ScriptEngineAbstraction chosen = null;
+            try {
+                Collection<? extends ScriptEngineAbstraction> list = Lookup.getDefault().lookupAll(ScriptEngineAbstraction.class);
+                for (ScriptEngineAbstraction s : list) {
+                    if (s.initialize(getJsHelperText())) {
+                        if (chosen == null || !(chosen instanceof JavaSE6ScriptEngine)) {
+                            chosen = s;
+                        }
+                    }
+                }
+            } catch (NoClassDefFoundError ncdfe) {
+                Logger.getLogger("global").log(Level.SEVERE, null, ncdfe);
+            }
+
+            if (chosen == null) {
+                NotifyDescriptor message = new NotifyDescriptor.Message("Could not find a scripting engine. Please make sure that the Rhino scripting engine is available. Otherwise filter cannot be used.", NotifyDescriptor.ERROR_MESSAGE);
+                DialogDisplayer.getDefault().notifyLater(message);
+                chosen = new NullScriptEngine();
+            }
+
+            engine = chosen;
+        }
+
+        return engine;
+    }
+
+    private static String getJsHelperText() {
+        InputStream is = null;
+        StringBuilder sb = new StringBuilder("importPackage(Packages.com.sun.hotspot.igv.filter);importPackage(Packages.com.sun.hotspot.igv.graph);importPackage(Packages.com.sun.hotspot.igv.data);importPackage(Packages.com.sun.hotspot.igv.util);importPackage(java.awt);");
+        try {
+            FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+            FileObject fo = fs.getRoot().getFileObject(JAVASCRIPT_HELPER_ID);
+            is = fo.getInputStream();
+            BufferedReader r = new BufferedReader(new InputStreamReader(is));
+            String s;
+            while ((s = r.readLine()) != null) {
+                sb.append(s);
+                sb.append("\n");
+            }
+
+        } catch (IOException ex) {
+            Logger.getLogger("global").log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                is.close();
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+        return sb.toString();
+    }
+
+    public void apply(Diagram d) {
+        getEngine().execute(d, code);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form
new file mode 100644
index 0000000..58a40cd
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.4" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+      <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+    </Property>
+    <Property name="resizable" type="boolean" value="false"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="1" attributes="0">
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="sourceLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                          <Component id="nameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jScrollPane1" pref="695" max="32767" attributes="1"/>
+                          <Component id="nameTextField" alignment="0" pref="695" max="32767" attributes="1"/>
+                      </Group>
+                  </Group>
+                  <Group type="102" alignment="1" attributes="0">
+                      <Component id="okButton" min="-2" pref="76" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="cancelButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="nameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="nameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="sourceLabel" min="-2" max="-2" attributes="0"/>
+                  <Component id="jScrollPane1" min="-2" pref="337" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="16" max="32767" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="okButton" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTextArea" name="sourceTextArea">
+          <Properties>
+            <Property name="columns" type="int" value="20"/>
+            <Property name="rows" type="int" value="5"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JTextField" name="nameTextField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/coordinator/Bundle.properties" key="nameTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="nameLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="sourceLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="okButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked,okButtonClicked"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="cancelButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java
new file mode 100644
index 0000000..7383e7f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.filter;
+
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditFilterDialog extends javax.swing.JDialog {
+
+    private CustomFilter customFilter;
+    private boolean accepted;
+
+    /** Creates new form EditFilterDialog */
+    public EditFilterDialog(CustomFilter customFilter) {
+        super(WindowManager.getDefault().getMainWindow(), true);
+        this.customFilter = customFilter;
+        initComponents();
+
+        sourceTextArea.setText(customFilter.getCode());
+        nameTextField.setText(customFilter.getName());
+    }
+
+    public boolean wasAccepted() {
+        return accepted;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jScrollPane1 = new javax.swing.JScrollPane();
+        sourceTextArea = new javax.swing.JTextArea();
+        nameTextField = new javax.swing.JTextField();
+        nameLabel = new javax.swing.JLabel();
+        sourceLabel = new javax.swing.JLabel();
+        okButton = new javax.swing.JButton();
+        cancelButton = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "title")); // NOI18N
+        setResizable(false);
+
+        sourceTextArea.setColumns(20);
+        sourceTextArea.setRows(5);
+        jScrollPane1.setViewportView(sourceTextArea);
+
+        nameTextField.setText("null");
+
+        nameLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel1.text")); // NOI18N
+
+        sourceLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel2.text")); // NOI18N
+
+        okButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton1.text")); // NOI18N
+        okButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                cancelButtonClicked(evt);
+                okButtonClicked(evt);
+            }
+        });
+
+        cancelButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton2.text")); // NOI18N
+        cancelButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                cancelButtonClicked(evt);
+            }
+        });
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                            .add(sourceLabel)
+                            .add(nameLabel))
+                        .add(25, 25, 25)
+                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                            .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)
+                            .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)))
+                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+                        .add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
+                        .add(cancelButton)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                    .add(nameLabel)
+                    .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(sourceLabel)
+                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 337, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 16, Short.MAX_VALUE)
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                    .add(cancelButton)
+                    .add(okButton))
+                .addContainerGap())
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+private void okButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonClicked
+        this.customFilter.setName(this.nameTextField.getText());
+        this.customFilter.setCode(this.sourceTextArea.getText());
+        accepted = true;
+        setVisible(false);
+}//GEN-LAST:event_okButtonClicked
+
+private void cancelButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonClicked
+        setVisible(false);
+}//GEN-LAST:event_cancelButtonClicked
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton cancelButton;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JLabel nameLabel;
+    private javax.swing.JTextField nameTextField;
+    private javax.swing.JButton okButton;
+    private javax.swing.JLabel sourceLabel;
+    private javax.swing.JTextArea sourceTextArea;
+    // End of variables declaration//GEN-END:variables
+
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java
new file mode 100644
index 0000000..2742ad2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.graph.Diagram;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Filter extends Properties.Provider, ChangedEventProvider<Filter> {
+
+    public String getName();
+
+    public void apply(Diagram d);
+
+    OpenCookie getEditor();
+
+    ChangedEvent<Filter> getChangedEvent();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java
new file mode 100644
index 0000000..340c748
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChain implements ChangedEventProvider<FilterChain> {
+
+    private List<Filter> filters;
+    private transient ChangedEvent<FilterChain> changedEvent;
+    private boolean fireEvents;
+
+    public FilterChain() {
+        filters = new ArrayList<Filter>();
+        changedEvent = new ChangedEvent<FilterChain>(this);
+        this.fireEvents = true;
+    }
+
+    public FilterChain(FilterChain f) {
+        this.filters = new ArrayList<Filter>(f.filters);
+        changedEvent = new ChangedEvent<FilterChain>(this);
+        this.fireEvents = true;
+    }
+
+    public ChangedEvent<FilterChain> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public Filter getFilterAt(int index) {
+        assert index >= 0 && index < filters.size();
+        return filters.get(index);
+    }
+
+    public void apply(Diagram d) {
+        for (Filter f : filters) {
+            f.apply(d);
+        }
+    }
+
+    public void apply(Diagram d, FilterChain sequence) {
+        List<Filter> applied = new ArrayList<Filter>();
+        for (Filter f : sequence.getFilters()) {
+            if (filters.contains(f)) {
+                f.apply(d);
+                applied.add(f);
+            }
+        }
+
+
+        for (Filter f : filters) {
+            if (!applied.contains(f)) {
+                f.apply(d);
+            }
+        }
+    }
+
+    public void beginAtomic() {
+        this.fireEvents = false;
+    }
+
+    public void endAtomic() {
+        this.fireEvents = true;
+        changedEvent.fire();
+    }
+
+    public void addFilter(Filter filter) {
+        assert filter != null;
+        filters.add(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void addFilterSameSequence(Filter filter) {
+        assert filter != null;
+        filters.add(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public boolean containsFilter(Filter filter) {
+        return filters.contains(filter);
+    }
+
+    public void removeFilter(Filter filter) {
+        assert filters.contains(filter);
+        filters.remove(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void moveFilterUp(Filter filter) {
+        assert filters.contains(filter);
+        int index = filters.indexOf(filter);
+        if (index != 0) {
+            filters.remove(index);
+            filters.add(index - 1, filter);
+        }
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void moveFilterDown(Filter filter) {
+        assert filters.contains(filter);
+        int index = filters.indexOf(filter);
+        if (index != filters.size() - 1) {
+            filters.remove(index);
+            filters.add(index + 1, filter);
+        }
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public List<Filter> getFilters() {
+        return Collections.unmodifiableList(filters);
+    }
+
+    public void clear() {
+        filters.clear();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java
new file mode 100644
index 0000000..d9ae82e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface FilterChainProvider {
+
+    public FilterChain getFilterChain();
+
+    public FilterChain getSequence();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java
new file mode 100644
index 0000000..aadd4bb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterSetting {
+
+    private Set<Filter> filters;
+    private String name;
+
+    public FilterSetting() {
+        this(null);
+    }
+
+    public FilterSetting(String name) {
+        this.name = name;
+        filters = new HashSet<Filter>();
+    }
+
+    public Set<Filter> getFilters() {
+        return Collections.unmodifiableSet(filters);
+    }
+
+    public void addFilter(Filter f) {
+        assert !filters.contains(f);
+        filters.add(f);
+    }
+
+    public void removeFilter(Filter f) {
+        assert filters.contains(f);
+        filters.remove(f);
+    }
+
+    public boolean containsFilter(Filter f) {
+        return filters.contains(f);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getFilterCount() {
+        return filters.size();
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java
new file mode 100644
index 0000000..1ba7fbc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaSE6ScriptEngine implements ScriptEngineAbstraction {
+
+    private ScriptEngine engine;
+    private Bindings bindings;
+
+    public boolean initialize(String jsHelperText) {
+        try {
+            ScriptEngineManager sem = new ScriptEngineManager();
+            ScriptEngine e = sem.getEngineByName("ECMAScript");
+            engine = e;
+            e.eval(jsHelperText);
+            Bindings b = e.getContext().getBindings(ScriptContext.ENGINE_SCOPE);
+            b.put("IO", System.out);
+            bindings = b;
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public void execute(Diagram d, String code) {
+        try {
+            Bindings b = bindings;
+            b.put("graph", d);
+            engine.eval(code, b);
+        } catch (ScriptException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java
new file mode 100644
index 0000000..94f3848
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class NullScriptEngine implements ScriptEngineAbstraction {
+
+    public boolean initialize(String jsHelperText) {
+        return true;
+    }
+
+    public void execute(Diagram d, String code) {
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java
new file mode 100644
index 0000000..f43793c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveFilter extends AbstractFilter {
+
+    private List<RemoveRule> rules;
+    private String name;
+
+    public RemoveFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<RemoveRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        for (RemoveRule r : rules) {
+
+            List<Figure> list = r.getSelector().selected(diagram);
+            Set<Figure> figuresToRemove = new HashSet<Figure>();
+
+            List<Figure> protectedFigures = null;
+            if (r.getRemoveAllWithoutPredecessor()) {
+                protectedFigures = diagram.getRootFigures();
+            }
+
+            for (Figure f : list) {
+                if (r.getRemoveOnlyInputs()) {
+                    List<InputSlot> inputSlots = new ArrayList<InputSlot>();
+                    for (InputSlot is : f.getInputSlots()) {
+                        inputSlots.add(is);
+                    }
+                    for (InputSlot is : inputSlots) {
+                        f.removeSlot(is);
+                    }
+
+                    f.createInputSlot();
+                } else {
+                    figuresToRemove.add(f);
+                }
+            }
+
+            if (r.getRemoveAllWithoutPredecessor()) {
+                boolean progress = true;
+                while (progress) {
+                    List<Figure> rootFigures = diagram.getRootFigures();
+                    progress = false;
+                    for (Figure f : rootFigures) {
+                        if (!protectedFigures.contains(f)) {
+                            figuresToRemove.add(f);
+                            progress = true;
+                        }
+                    }
+                }
+            }
+
+            diagram.removeAllFigures(figuresToRemove);
+        }
+    }
+
+    public void addRule(RemoveRule rule) {
+        rules.add(rule);
+    }
+
+    public static class RemoveRule {
+
+        private Selector selector;
+        private boolean removeAllWithoutPredecessor;
+        private boolean removeOnlyInputs;
+
+        public RemoveRule(Selector selector, boolean b) {
+            this(selector, b, false);
+        }
+
+        public RemoveRule(Selector selector, boolean removeAllWithoutPredecessor, boolean removeOnlyInputs) {
+            this.selector = selector;
+            this.removeOnlyInputs = removeOnlyInputs;
+            this.removeAllWithoutPredecessor = removeAllWithoutPredecessor;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public boolean getRemoveOnlyInputs() {
+            return removeOnlyInputs;
+        }
+
+        public boolean getRemoveAllWithoutPredecessor() {
+            return removeAllWithoutPredecessor;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java
new file mode 100644
index 0000000..61b21a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveInputsFilter extends AbstractFilter {
+
+    private List<RemoveInputsRule> rules;
+    private String name;
+
+    public RemoveInputsFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<RemoveInputsRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        for (RemoveInputsRule r : rules) {
+
+            List<Figure> list = r.getSelector().selected(diagram);
+            for (Figure f : list) {
+                int z = 0;
+                List<InputSlot> last = new ArrayList<InputSlot>();
+                for (InputSlot is : f.getInputSlots()) {
+                    if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) {
+                        StringBuilder sb = new StringBuilder();
+                        List<Connection> conns = is.getConnections();
+                        for (int i = 0; i < conns.size(); i++) {
+                            Connection c = conns.get(i);
+                            OutputSlot os = c.getOutputSlot();
+                            Figure pred = os.getFigure();
+                            if (i != 0) {
+                                sb.append("<BR>");
+                            }
+                            sb.append(pred.getLines()[0]);
+                        }
+                        is.removeAllConnections();
+                        is.setShortName("X");
+                        is.setName(sb.toString());
+                        last.add(is);
+                    } else {
+                        last.clear();
+                    }
+                    z++;
+                }
+
+                if (last.size() > 3) {
+                    InputSlot first = last.get(0);
+                    first.setShortName("XX");
+
+                    StringBuilder sb = new StringBuilder();
+                    for (int i = 0; i < last.size(); i++) {
+                        InputSlot is2 = last.get(i);
+                        if (i != 0) {
+                            sb.append("<BR>");
+                        }
+                        sb.append(is2.getName());
+                    }
+
+                    first.setName(sb.toString());
+
+                    for (int i = 1; i < last.size(); i++) {
+                        f.removeSlot(last.get(i));
+                    }
+                }
+            }
+        }
+    }
+
+    public void addRule(RemoveInputsRule rule) {
+        rules.add(rule);
+    }
+
+    public static class RemoveInputsRule {
+
+        private Selector selector;
+        private int startingIndex;
+        private int endIndex;
+
+        public RemoveInputsRule(Selector selector) {
+            this(selector, 0);
+        }
+
+        public RemoveInputsRule(Selector selector, int startIndex) {
+            this(selector, startIndex, Integer.MAX_VALUE);
+        }
+
+        public RemoveInputsRule(Selector selector, int startIndex, int endIndex) {
+            this.startingIndex = startIndex;
+            this.endIndex = endIndex;
+            this.selector = selector;
+        }
+
+        public int getStartingIndex() {
+            return startingIndex;
+        }
+
+        public int getEndIndex() {
+            return endIndex;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java
new file mode 100644
index 0000000..c8fd54b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveSelfLoopsFilter extends AbstractFilter {
+
+    private String name;
+
+    /** Creates a new instance of RemoveSelfLoops */
+    public RemoveSelfLoopsFilter(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram d) {
+
+        for (Figure f : d.getFigures()) {
+
+            for (InputSlot is : f.getInputSlots()) {
+
+                List<Connection> toRemove = new ArrayList<Connection>();
+                for (Connection c : is.getConnections()) {
+
+                    if (c.getOutputSlot().getFigure() == f) {
+                        toRemove.add(c);
+                    }
+                }
+
+                for (Connection c : toRemove) {
+
+                    c.remove();
+
+                    OutputSlot os = c.getOutputSlot();
+                    if (os.getConnections().size() == 0) {
+                        f.removeSlot(os);
+                    }
+
+                    c.getInputSlot().setShortName("O");
+                    c.getInputSlot().setName("Self Loop");
+                }
+            }
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java
new file mode 100644
index 0000000..065725e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ScriptEngineAbstraction {
+
+    public boolean initialize(String jsHelperText);
+
+    public void execute(Diagram d, String code);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java
new file mode 100644
index 0000000..e4c2554
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SplitFilter extends AbstractFilter {
+
+    private String name;
+    private Selector selector;
+
+    public SplitFilter(String name, Selector selector) {
+        this.name = name;
+        this.selector = selector;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram d) {
+        List<Figure> list = selector.selected(d);
+
+        for (Figure f : list) {
+            for (OutputSlot os : f.getOutputSlots()) {
+                for (Connection c : os.getConnections()) {
+                    InputSlot is = c.getInputSlot();
+                    is.setName(f.getProperties().getProperty("dump_spec"));
+                    String s = f.getProperties().getProperty("short_name");
+                    if (s != null) {
+                        is.setShortName(s);
+                    }
+                }
+            }
+
+            d.removeFigure(f);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js
new file mode 100644
index 0000000..d45f682
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ /**
+ *
+ * @author Thomas Wuerthinger
+ */
+
+function colorize(property, regexp, color) {
+    var f = new ColorFilter("");
+    f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), color));
+    f.apply(graph);
+}
+
+function remove(property, regexp) {
+    var f = new RemoveFilter("");
+    f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), false, false));
+    f.apply(graph);
+}
+
+function split(property, regexp) {
+    var f = new SplitFilter("", new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)));
+    f.apply(graph);
+}
+
+function removeInputs(property, regexp, from, to) {
+    var f = new RemoveInputsFilter("");
+    if(from == undefined && to == undefined) {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp))));
+    } else if(to == undefined) {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from));
+    } else {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from, to));
+    }
+    f.apply(graph);
+}
+
+var black = Color.black;
+var blue = Color.blue;
+var cyan = Color.cyan;
+var darkGray = Color.darkGray;
+var gray = Color.gray;
+var green = Color.green;
+var lightGray = Color.lightGray;
+var magenta = Color.magenta;
+var orange = Color.orange;
+var pink = Color.pink
+var red = Color.red;
+var yellow = Color.yellow;
+var white = Color.white;
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml
new file mode 100644
index 0000000..32fe79f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+        <file name="JavaScriptHelper" url="helper.js"/>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml
new file mode 100644
index 0000000..e604ea7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filterwindow" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.filterwindow.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf
new file mode 100644
index 0000000..ba14856
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.filterwindow

+OpenIDE-Module-Layer: com/sun/hotspot/igv/filterwindow/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filterwindow/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml
new file mode 100644
index 0000000..0126556
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.filterwindow-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties
new file mode 100644
index 0000000..b9832d5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=401b2654
+build.xml.script.CRC32=9c158403
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=401b2654
+nbproject/build-impl.xml.script.CRC32=19fb08e0
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml
new file mode 100644
index 0000000..7740f12
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.filterwindow</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.12.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.18.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider
new file mode 100644
index 0000000..a3cdc88
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider
@@ -0,0 +1 @@
+com.sun.hotspot.igv.filterwindow.FilterChainProviderImplementation

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties
new file mode 100644
index 0000000..c7f2ba7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties
@@ -0,0 +1,3 @@
+OpenIDE-Module-Name=FilterWindow
+CTL_FilterTopComponent=Filter Window
+HINT_FilterTopComponent=This is a Filter window
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java
new file mode 100644
index 0000000..911a7c7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import javax.swing.JList;
+import org.openide.explorer.view.ListView;
+import org.openide.explorer.view.NodeListModel;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckListView extends ListView {
+
+    @Override
+    public void showSelection(int[] indices) {
+        super.showSelection(indices);
+    }
+
+    @Override
+    protected NodeListModel createModel() {
+        return new CheckNodeListModel();
+    }
+
+    @Override
+    protected JList createList() {
+        JList tmpList = super.createList();
+        tmpList.setCellRenderer(new CheckRenderer(tmpList));
+        return tmpList;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java
new file mode 100644
index 0000000..d8f2e04
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNode extends AbstractNode {
+
+    private ChangedEvent<CheckNode> selectionChangedEvent;
+    public boolean selected;
+    public boolean enabled;
+
+    public CheckNode(Children c, Lookup lookup) {
+        super(c, lookup);
+        selectionChangedEvent = new ChangedEvent<CheckNode>(this);
+        selected = false;
+        enabled = true;
+    }
+
+    public ChangedEvent<CheckNode> getSelectionChangedEvent() {
+        return selectionChangedEvent;
+    }
+
+    public boolean isSelected() {
+        return selected;
+    }
+
+    public void setSelected(boolean b) {
+        if (b != selected) {
+            selected = b;
+            selectionChangedEvent.fire();
+        }
+    }
+
+    public void setEnabled(boolean b) {
+        enabled = b;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java
new file mode 100644
index 0000000..caf7502
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import org.openide.explorer.view.NodeListModel;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNodeListModel extends NodeListModel {
+
+    private Node rootNode;
+
+    @Override
+    public void setNode(Node rootNode) {
+        this.rootNode = rootNode;
+        super.setNode(rootNode);
+    }
+
+    public CheckNode getCheckNodeAt(int index) {
+        return (CheckNode) rootNode.getChildren().getNodes()[index];
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java
new file mode 100644
index 0000000..f37716f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class CheckRenderer extends JCheckBox implements ListCellRenderer {
+
+    private JList list;
+    private Color startBackground;
+
+    public CheckRenderer(final JList list) {
+        this.list = list;
+        list.addMouseListener(
+                new MouseAdapter() {
+
+                    @Override
+                    public void mouseClicked(MouseEvent e) {
+                        int index = list.locationToIndex(e.getPoint());
+                        Point p2 = list.indexToLocation(index);
+                        Rectangle r = new Rectangle(p2.x, p2.y, getPreferredSize().height, getPreferredSize().height);
+                        if (r.contains(e.getPoint())) {
+                            CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+                            node.setSelected(!node.isSelected());
+                            list.repaint();
+                            e.consume();
+                        }
+                    }
+                });
+
+        this.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 5));
+        startBackground = this.getBackground();
+    }
+
+    public Component getListCellRendererComponent(final JList list, Object value, final int index, boolean isSelected, boolean cellHasFocus) {
+        setText(value.toString());
+        CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+        this.setSelected(node.isSelected());
+        this.setEnabled(list.isEnabled());
+
+        if (isSelected && list.hasFocus()) {
+            this.setBackground(list.getSelectionBackground());
+            this.setForeground(list.getSelectionForeground());
+        } else if (isSelected) {
+            assert !list.hasFocus();
+            this.setBackground(startBackground);
+            this.setForeground(list.getForeground());
+
+        } else {
+            this.setBackground(list.getBackground());
+            this.setForeground(list.getForeground());
+        }
+        return this;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java
new file mode 100644
index 0000000..407ce39
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChainProviderImplementation implements FilterChainProvider {
+
+    public FilterChain getFilterChain() {
+        return FilterTopComponent.findInstance().getFilterChain();
+    }
+
+    public FilterChain getSequence() {
+        return FilterTopComponent.findInstance().getSequence();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java
new file mode 100644
index 0000000..9626513
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.nodes.Children;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterNode extends CheckNode implements LookupListener, ChangedListener<FilterTopComponent> {
+
+    private Filter filter;
+    private Lookup.Result result;
+
+    public FilterNode(Filter filter) {
+        this(filter, new InstanceContent());
+    }
+
+    private FilterNode(Filter filter, InstanceContent content) {
+        super(Children.LEAF, new AbstractLookup(content));
+        content.add(filter);
+
+        content.add(filter.getEditor());
+        this.filter = filter;
+        filter.getChangedEvent().addListener(new ChangedListener<Filter>() {
+
+            public void changed(Filter source) {
+                update();
+            }
+        });
+
+        update();
+
+        Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+
+        FilterTopComponent.findInstance().getFilterSettingsChangedEvent().addListener(this);
+        resultChanged(null);
+    }
+
+    private void update() {
+        this.setDisplayName(filter.getName());
+    }
+
+    public Filter getFilter() {
+        return filter;
+    }
+
+    @Override
+    protected Sheet createSheet() {
+        Sheet s = super.createSheet();
+        PropertiesSheet.initializeSheet(getFilter().getProperties(), s);
+        return s;
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) OpenAction.findObject(OpenAction.class, true), (Action) MoveFilterUpAction.findObject(MoveFilterUpAction.class, true), (Action) MoveFilterDownAction.findObject(MoveFilterDownAction.class, true), (Action) RemoveFilterAction.findObject(RemoveFilterAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return OpenAction.get(OpenAction.class).createContextAwareInstance(Utilities.actionsGlobalContext());
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        changed(FilterTopComponent.findInstance());
+    }
+
+    public void changed(FilterTopComponent source) {
+        setSelected(source.getFilterChain().containsFilter(filter));
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form
new file mode 100644
index 0000000..f3fc524
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java
new file mode 100644
index 0000000..7cd32e8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java
@@ -0,0 +1,689 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.NewFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterSettingsAction;
+import com.sun.hotspot.igv.filterwindow.actions.SaveFilterSettingsAction;
+import com.sun.hotspot.igv.filter.CustomFilter;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterSetting;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.JComboBox;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.ErrorManager;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.awt.Toolbar;
+import org.openide.filesystems.FileLock;
+import org.openide.util.actions.SystemAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class FilterTopComponent extends TopComponent implements LookupListener, ExplorerManager.Provider {
+
+    private static FilterTopComponent instance;
+    public static final String FOLDER_ID = "Filters";
+    public static final String AFTER_ID = "after";
+    public static final String ENABLED_ID = "enabled";
+    public static final String PREFERRED_ID = "FilterTopComponent";
+    private CheckListView view;
+    private ExplorerManager manager;
+    private FilterChain filterChain;
+    private FilterChain sequence;
+    private Lookup.Result result;
+    private JComboBox comboBox;
+    private List<FilterSetting> filterSettings;
+    private FilterSetting customFilterSetting = new FilterSetting("-- Custom --");
+    private ChangedEvent<FilterTopComponent> filterSettingsChangedEvent;
+    private ActionListener comboBoxActionListener = new ActionListener() {
+
+        public void actionPerformed(ActionEvent e) {
+            comboBoxSelectionChanged();
+        }
+    };
+
+    public ChangedEvent<FilterTopComponent> getFilterSettingsChangedEvent() {
+        return filterSettingsChangedEvent;
+    }
+
+    public FilterChain getSequence() {
+        return sequence;
+    }
+
+    public void updateSelection() {
+        Node[] nodes = this.getExplorerManager().getSelectedNodes();
+        int[] arr = new int[nodes.length];
+        for (int i = 0; i < nodes.length; i++) {
+            int index = sequence.getFilters().indexOf(((FilterNode) nodes[i]).getFilter());
+            arr[i] = index;
+        }
+        view.showSelection(arr);
+    }
+
+    private void comboBoxSelectionChanged() {
+
+        Object o = comboBox.getSelectedItem();
+        if (o == null) {
+            return;
+        }
+        assert o instanceof FilterSetting;
+        FilterSetting s = (FilterSetting) o;
+
+        if (s != customFilterSetting) {
+            FilterChain chain = getFilterChain();
+            chain.beginAtomic();
+            List<Filter> toRemove = new ArrayList<Filter>();
+            for (Filter f : chain.getFilters()) {
+                if (!s.containsFilter(f)) {
+                    toRemove.add(f);
+                }
+            }
+            for (Filter f : toRemove) {
+                chain.removeFilter(f);
+            }
+
+            for (Filter f : s.getFilters()) {
+                if (!chain.containsFilter(f)) {
+                    chain.addFilter(f);
+                }
+            }
+
+            chain.endAtomic();
+            filterSettingsChangedEvent.fire();
+        } else {
+            this.updateComboBoxSelection();
+        }
+
+        SystemAction.get(RemoveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() != this.customFilterSetting);
+        SystemAction.get(SaveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() == this.customFilterSetting);
+    }
+
+    private void updateComboBox() {
+        comboBox.removeAllItems();
+        comboBox.addItem(customFilterSetting);
+        for (FilterSetting s : filterSettings) {
+            comboBox.addItem(s);
+        }
+
+        this.updateComboBoxSelection();
+    }
+
+    public void addFilterSetting() {
+        NotifyDescriptor.InputLine l = new NotifyDescriptor.InputLine("Enter a name:", "Filter");
+        if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.OK_OPTION) {
+            String name = l.getInputText();
+
+            FilterSetting toRemove = null;
+            for (FilterSetting s : filterSettings) {
+                if (s.getName().equals(name)) {
+                    NotifyDescriptor.Confirmation conf = new NotifyDescriptor.Confirmation("Filter \"" + name + "\" already exists, to you want to overwrite?", "Filter");
+                    if (DialogDisplayer.getDefault().notify(conf) == NotifyDescriptor.YES_OPTION) {
+                        toRemove = s;
+                        break;
+                    } else {
+                        return;
+                    }
+                }
+            }
+
+            if (toRemove != null) {
+                filterSettings.remove(toRemove);
+            }
+            FilterSetting setting = createFilterSetting(name);
+            filterSettings.add(setting);
+
+            // Sort alphabetically
+            Collections.sort(filterSettings, new Comparator<FilterSetting>() {
+
+                public int compare(FilterSetting o1, FilterSetting o2) {
+                    return o1.getName().compareTo(o2.getName());
+                }
+            });
+
+            updateComboBox();
+        }
+    }
+
+    public boolean canRemoveFilterSetting() {
+        return comboBox.getSelectedItem() != customFilterSetting;
+    }
+
+    public void removeFilterSetting() {
+        if (canRemoveFilterSetting()) {
+            Object o = comboBox.getSelectedItem();
+            assert o instanceof FilterSetting;
+            FilterSetting f = (FilterSetting) o;
+            assert f != customFilterSetting;
+            assert filterSettings.contains(f);
+            NotifyDescriptor.Confirmation l = new NotifyDescriptor.Confirmation("Do you really want to remove filter \"" + f + "\"?", "Filter");
+            if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.YES_OPTION) {
+                filterSettings.remove(f);
+                updateComboBox();
+            }
+        }
+    }
+
+    private FilterSetting createFilterSetting(String name) {
+        FilterSetting s = new FilterSetting(name);
+        FilterChain chain = this.getFilterChain();
+        for (Filter f : chain.getFilters()) {
+            s.addFilter(f);
+        }
+        return s;
+    }
+
+    private void updateComboBoxSelection() {
+        List<Filter> filters = this.getFilterChain().getFilters();
+        boolean found = false;
+        for (FilterSetting s : filterSettings) {
+            if (s.getFilterCount() == filters.size()) {
+                boolean ok = true;
+                for (Filter f : filters) {
+                    if (!s.containsFilter(f)) {
+                        ok = false;
+                    }
+                }
+
+                if (ok) {
+                    if (comboBox.getSelectedItem() != s) {
+                        comboBox.setSelectedItem(s);
+                    }
+                    found = true;
+                    break;
+                }
+            }
+        }
+
+        if (!found && comboBox.getSelectedItem() != customFilterSetting) {
+            comboBox.setSelectedItem(customFilterSetting);
+        }
+    }
+
+    private class FilterChildren extends Children.Keys implements ChangedListener<CheckNode> {
+
+        //private Node[] oldSelection;
+        //private ArrayList<Node> newSelection;
+        private HashMap<Object, Node> nodeHash = new HashMap<Object, Node>();
+
+        protected Node[] createNodes(Object object) {
+            if (nodeHash.containsKey(object)) {
+                return new Node[]{nodeHash.get(object)};
+            }
+
+            assert object instanceof Filter;
+            Filter filter = (Filter) object;
+            com.sun.hotspot.igv.filterwindow.FilterNode node = new com.sun.hotspot.igv.filterwindow.FilterNode(filter);
+            node.getSelectionChangedEvent().addListener(this);
+            nodeHash.put(object, node);
+            return new Node[]{node};
+        }
+
+        public FilterChildren() {
+            sequence.getChangedEvent().addListener(new ChangedListener<FilterChain>() {
+
+                public void changed(FilterChain source) {
+                    addNotify();
+                }
+            });
+
+            setBefore(false);
+        }
+
+        protected void addNotify() {
+            setKeys(sequence.getFilters());
+            updateSelection();
+        }
+
+        public void changed(CheckNode source) {
+            FilterNode node = (FilterNode) source;
+            Filter f = node.getFilter();
+            FilterChain chain = getFilterChain();
+            if (node.isSelected()) {
+                if (!chain.containsFilter(f)) {
+                    chain.addFilter(f);
+                }
+            } else {
+                if (chain.containsFilter(f)) {
+                    chain.removeFilter(f);
+                }
+            }
+            view.revalidate();
+            view.repaint();
+            updateComboBoxSelection();
+        }
+    }
+
+    public FilterChain getFilterChain() {
+        return filterChain;/*
+    EditorTopComponent tc = EditorTopComponent.getActive();
+    if (tc == null) {
+    return filterChain;
+    }
+    return tc.getFilterChain();*/
+    }
+
+    private FilterTopComponent() {
+        filterSettingsChangedEvent = new ChangedEvent<FilterTopComponent>(this);
+        initComponents();
+        setName(NbBundle.getMessage(FilterTopComponent.class, "CTL_FilterTopComponent"));
+        setToolTipText(NbBundle.getMessage(FilterTopComponent.class, "HINT_FilterTopComponent"));
+        //        setIcon(Utilities.loadImage(ICON_PATH, true));
+
+        sequence = new FilterChain();
+        filterChain = new FilterChain();
+        initFilters();
+        manager = new ExplorerManager();
+        manager.setRootContext(new AbstractNode(new FilterChildren()));
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+        view = new CheckListView();
+
+        ToolbarPool.getDefault().setPreferredIconSize(16);
+        Toolbar toolBar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolBar.setBorder(b);
+        comboBox = new JComboBox();
+        toolBar.add(comboBox);
+        this.add(toolBar, BorderLayout.NORTH);
+        toolBar.add(SaveFilterSettingsAction.get(SaveFilterSettingsAction.class));
+        toolBar.add(RemoveFilterSettingsAction.get(RemoveFilterSettingsAction.class));
+        toolBar.addSeparator();
+        toolBar.add(MoveFilterUpAction.get(MoveFilterUpAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(MoveFilterDownAction.get(MoveFilterDownAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(RemoveFilterAction.get(RemoveFilterAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(NewFilterAction.get(NewFilterAction.class));
+        this.add(view, BorderLayout.CENTER);
+
+        filterSettings = new ArrayList<FilterSetting>();
+        updateComboBox();
+
+        comboBox.addActionListener(comboBoxActionListener);
+        setChain(filterChain);
+    }
+
+    public void newFilter() {
+        CustomFilter cf = new CustomFilter("My custom filter", "");
+        if (cf.openInEditor()) {
+            sequence.addFilter(cf);
+            FileObject fo = getFileObject(cf);
+            FilterChangedListener listener = new FilterChangedListener(fo, cf);
+            listener.changed(cf);
+            cf.getChangedEvent().addListener(listener);
+        }
+    }
+
+    public void removeFilter(Filter f) {
+        com.sun.hotspot.igv.filter.CustomFilter cf = (com.sun.hotspot.igv.filter.CustomFilter) f;
+
+        sequence.removeFilter(cf);
+        try {
+            getFileObject(cf).delete();
+        } catch (IOException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+
+    }
+
+    private static class FilterChangedListener implements ChangedListener<Filter> {
+
+        private FileObject fileObject;
+        private CustomFilter filter;
+
+        public FilterChangedListener(FileObject fo, CustomFilter cf) {
+            fileObject = fo;
+            filter = cf;
+        }
+
+        public void changed(Filter source) {
+            try {
+                if (!fileObject.getName().equals(filter.getName())) {
+                    FileLock lock = fileObject.lock();
+                    fileObject.move(lock, fileObject.getParent(), filter.getName(), "");
+                    lock.releaseLock();
+                    FileObject newFileObject = fileObject.getParent().getFileObject(filter.getName());
+                    fileObject = newFileObject;
+
+                }
+
+                FileLock lock = fileObject.lock();
+                OutputStream os = fileObject.getOutputStream(lock);
+                Writer w = new OutputStreamWriter(os);
+                String s = filter.getCode();
+                w.write(s);
+                w.close();
+                lock.releaseLock();
+
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+    }
+
+    public void initFilters() {
+
+        FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+        FileObject folder = fs.getRoot().getFileObject(FOLDER_ID);
+        FileObject[] children = folder.getChildren();
+
+        List<CustomFilter> customFilters = new ArrayList<CustomFilter>();
+        HashMap<CustomFilter, String> afterMap = new HashMap<CustomFilter, String>();
+        Set<CustomFilter> enabledSet = new HashSet<CustomFilter>();
+        HashMap<String, CustomFilter> map = new HashMap<String, CustomFilter>();
+
+        for (final FileObject fo : children) {
+            InputStream is = null;
+
+            String code = "";
+            FileLock lock = null;
+            try {
+                lock = fo.lock();
+                is = fo.getInputStream();
+                BufferedReader r = new BufferedReader(new InputStreamReader(is));
+                String s;
+                StringBuffer sb = new StringBuffer();
+                while ((s = r.readLine()) != null) {
+                    sb.append(s);
+                    sb.append("\n");
+                }
+                code = sb.toString();
+
+            } catch (FileNotFoundException ex) {
+                Exceptions.printStackTrace(ex);
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            } finally {
+                try {
+                    is.close();
+                } catch (IOException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+                lock.releaseLock();
+            }
+
+            String displayName = fo.getName();
+
+
+            final CustomFilter cf = new CustomFilter(displayName, code);
+            map.put(displayName, cf);
+
+            String after = (String) fo.getAttribute(AFTER_ID);
+            afterMap.put(cf, after);
+
+            Boolean enabled = (Boolean) fo.getAttribute(ENABLED_ID);
+            if (enabled != null && (boolean) enabled) {
+                enabledSet.add(cf);
+            }
+
+            cf.getChangedEvent().addListener(new FilterChangedListener(fo, cf));
+
+            customFilters.add(cf);
+        }
+
+        for (int j = 0; j < customFilters.size(); j++) {
+            for (int i = 0; i < customFilters.size(); i++) {
+                List<CustomFilter> copiedList = new ArrayList<CustomFilter>(customFilters);
+                for (CustomFilter cf : copiedList) {
+
+                    String after = afterMap.get(cf);
+
+                    if (map.containsKey(after)) {
+                        CustomFilter afterCf = map.get(after);
+                        int index = customFilters.indexOf(afterCf);
+                        int currentIndex = customFilters.indexOf(cf);
+
+                        if (currentIndex < index) {
+                            customFilters.remove(currentIndex);
+                            customFilters.add(index, cf);
+                        }
+                    }
+                }
+            }
+        }
+
+        for (CustomFilter cf : customFilters) {
+            sequence.addFilter(cf);
+            if (enabledSet.contains(cf)) {
+                filterChain.addFilter(cf);
+            }
+        }
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        setLayout(new java.awt.BorderLayout());
+
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized FilterTopComponent getDefault() {
+        if (instance == null) {
+            instance = new FilterTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the FilterTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized FilterTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Filter component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof FilterTopComponent) {
+            return (FilterTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    @Override
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        setChain(Utilities.actionsGlobalContext().lookup(FilterChain.class));
+    /*
+    EditorTopComponent tc = EditorTopComponent.getActive();
+    if (tc != null) {
+    setChain(tc.getFilterChain());
+    }*/
+    }
+
+    public void setChain(FilterChain chain) {
+        updateComboBoxSelection();
+    }
+
+    private FileObject getFileObject(CustomFilter cf) {
+        FileObject fo = Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID + "/" + cf.getName());
+        if (fo == null) {
+            try {
+                fo = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID).createData(cf.getName());
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+        return fo;
+    }
+
+    @Override
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal(out);
+
+        out.writeInt(filterSettings.size());
+        for (FilterSetting f : filterSettings) {
+            out.writeUTF(f.getName());
+
+            out.writeInt(f.getFilterCount());
+            for (Filter filter : f.getFilters()) {
+                CustomFilter cf = (CustomFilter) filter;
+                out.writeUTF(cf.getName());
+            }
+        }
+
+        CustomFilter prev = null;
+        for (Filter f : this.sequence.getFilters()) {
+            CustomFilter cf = (CustomFilter) f;
+            FileObject fo = getFileObject(cf);
+            if (getFilterChain().containsFilter(cf)) {
+                fo.setAttribute(ENABLED_ID, true);
+            } else {
+                fo.setAttribute(ENABLED_ID, false);
+            }
+
+            if (prev == null) {
+                fo.setAttribute(AFTER_ID, null);
+            } else {
+                fo.setAttribute(AFTER_ID, prev.getName());
+            }
+
+            prev = cf;
+        }
+    }
+
+    public CustomFilter findFilter(String name) {
+        for (Filter f : sequence.getFilters()) {
+
+            CustomFilter cf = (CustomFilter) f;
+            if (cf.getName().equals(name)) {
+                return cf;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal(in);
+
+        int filterSettingsCount = in.readInt();
+        for (int i = 0; i < filterSettingsCount; i++) {
+            String name = in.readUTF();
+            FilterSetting s = new FilterSetting(name);
+            int filterCount = in.readInt();
+            for (int j = 0; j < filterCount; j++) {
+                String filterName = in.readUTF();
+                CustomFilter filter = findFilter(filterName);
+                if (filter != null) {
+                    s.addFilter(filter);
+                }
+            }
+
+            filterSettings.add(s);
+        }
+        updateComboBox();
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return FilterTopComponent.getDefault();
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml
new file mode 100644
index 0000000..6ae22f0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.filterwindow.FilterTopComponent"/>
+    <instance class="com.sun.hotspot.igv.filterwindow.FilterTopComponent" method="getDefault"/>
+</settings>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml
new file mode 100644
index 0000000..cc493bc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+    <tc-id id="FilterTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties
new file mode 100644
index 0000000..8cf238d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties
@@ -0,0 +1,10 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+CTL_FilterAction=Open Filter Window
+CTL_MoveFilterDownAction=Move downwards
+CTL_MoveFilterUpAction=Move upwards
+CTL_NewFilterAction=New filter...
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveFilterSettingsAction=Save filter settings...
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java
new file mode 100644
index 0000000..ad2d1e4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterAction extends AbstractAction {
+
+    public FilterAction() {
+        super(NbBundle.getMessage(FilterAction.class, "CTL_FilterAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = FilterTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java
new file mode 100644
index 0000000..c2849fc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterDownAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            Filter c = n.getLookup().lookup(Filter.class);
+            FilterTopComponent.findInstance().getSequence().moveFilterDown(c);
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public MoveFilterDownAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Move filter downwards");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterDownAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/down.gif";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java
new file mode 100644
index 0000000..c75238b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterUpAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            Filter c = n.getLookup().lookup(Filter.class);
+            FilterTopComponent.findInstance().getSequence().moveFilterUp(c);
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public MoveFilterUpAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Move filter upwards");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterUpAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/up.gif";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java
new file mode 100644
index 0000000..22bb760
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NewFilterAction extends CallableSystemAction {
+
+    public NewFilterAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Create new filter");
+    }
+
+    public void performAction() {
+        FilterTopComponent.findInstance().newFilter();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_NewFilterAction");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/plus.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java
new file mode 100644
index 0000000..86d8577
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        Object[] options = {"Yes",
+            "No",
+            "Cancel"
+        };
+        int n = JOptionPane.showOptionDialog(WindowManager.getDefault().getMainWindow(),
+                "Do you really want to delete " + activatedNodes.length + " filter/s?", "Delete?",
+                JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.QUESTION_MESSAGE,
+                null,
+                options,
+                options[2]);
+
+        if (n == JOptionPane.YES_OPTION) {
+            for (int i = 0; i < activatedNodes.length; i++) {
+                FilterTopComponent.findInstance().removeFilter(activatedNodes[i].getLookup().lookup(Filter.class));
+            }
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_ALL;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveFilterAction.class, "CTL_RemoveFilterAction");
+    }
+
+    public RemoveFilterAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove filter");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/minus.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java
new file mode 100644
index 0000000..ead48f2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterSettingsAction extends CallableSystemAction {
+
+    public void performAction() {
+        FilterTopComponent.findInstance().removeFilterSetting();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveFilterSettingsAction.class, "CTL_RemoveFilterSettingsAction");
+    }
+
+    public RemoveFilterSettingsAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove filter profile");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/delete.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java
new file mode 100644
index 0000000..59d5b78
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveFilterSettingsAction extends CallableSystemAction {
+
+    public void performAction() {
+        FilterTopComponent.findInstance().addFilterSetting();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_SaveFilterSettingsAction");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public SaveFilterSettingsAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Create new filter profile");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/add.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml
new file mode 100644
index 0000000..ca1b277
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+    <name unique="customRightTopMode" />
+    <kind type="view" />
+    <state type="joined" />
+    <constraints>
+        <path orientation="horizontal" number="45" weight="0.21761006289308177"/>
+        <path orientation="vertical" number="0" weight="0.2510122989593188"/>
+    </constraints>
+    <bounds x="0" y="0" width="0" height="0" />
+    <frame state="0"/>
+    <active-tc id="FilterTopComponent"/>
+    <empty-behavior permanent="false"/>
+</mode>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif
new file mode 100644
index 0000000..0fc47e1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif
new file mode 100644
index 0000000..3f83fce
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif
new file mode 100644
index 0000000..6123422
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif
new file mode 100644
index 0000000..ba0d281
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif
new file mode 100644
index 0000000..5e2274d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif
new file mode 100644
index 0000000..277f5bb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml
new file mode 100644
index 0000000..8d1367e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Edit">
+        <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterDownAction.instance">
+            <attr name="position" intvalue="300"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterUpAction.instance">
+            <attr name="position" intvalue="400"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterAction.instance">
+            <attr name="position" intvalue="500"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterSettingsAction.instance">
+            <attr name="position" intvalue="600"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-SaveFilterSettingsAction.instance">
+            <attr name="position" intvalue="900"/>
+        </file>
+    </folder>
+    <folder name="Window">
+        <file name="com-sun-hotspot-igv-coordinator-actions-FilterAction.instance"/>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="FilterAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-filterwindow-actions-FilterAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="FilterTopComponent.settings" url="FilterTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <file name="customRightTopMode.wsmode" url="customRightTopWsmode.xml"/>
+            <folder name="customRightTopMode">
+                <file name="FilterTopComponent.wstcref" url="FilterTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml
new file mode 100644
index 0000000..7843b57
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.graph" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.graph.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf
new file mode 100644
index 0000000..aee3b0e8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.graph

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/graph/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml
new file mode 100644
index 0000000..d4b8738
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.graph-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties
new file mode 100644
index 0000000..473f819
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b2bc2f02
+build.xml.script.CRC32=486d5dab
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b2bc2f02
+nbproject/build-impl.xml.script.CRC32=17fa0f49
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml
new file mode 100644
index 0000000..c8fbe3c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.graph</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java
new file mode 100644
index 0000000..d15ed8d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class AndSelector implements Selector {
+
+    private Selector selector1;
+    private Selector selector2;
+
+    public AndSelector(Selector s1, Selector s2) {
+        this.selector1 = s1;
+        this.selector2 = s2;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> l1 = selector1.selected(d);
+        List<Figure> l2 = selector2.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : l2) {
+            if (l1.contains(f)) {
+                result.add(f);
+            }
+        }
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java
new file mode 100644
index 0000000..eaa73b7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import java.awt.Rectangle;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Block implements Cluster {
+
+    private InputBlock inputBlock;
+    private Rectangle bounds;
+    private Diagram diagram;
+
+    public Block(InputBlock inputBlock, Diagram diagram) {
+        this.inputBlock = inputBlock;
+        this.diagram = diagram;
+    }
+
+    public Cluster getOuter() {
+        return null;
+    }
+
+    public InputBlock getInputBlock() {
+        return inputBlock;
+    }
+
+    public Set<? extends Cluster> getSuccessors() {
+        Set<Block> succs = new HashSet<Block>();
+        for (InputBlock b : inputBlock.getSuccessors()) {
+            succs.add(diagram.getBlock(b));
+        }
+        return succs;
+    }
+
+    public Set<? extends Cluster> getPredecessors() {
+        Set<Block> succs = new HashSet<Block>();
+        for (InputBlock b : inputBlock.getPredecessors()) {
+            succs.add(diagram.getBlock(b));
+        }
+        return succs;
+    }
+
+    public void setBounds(Rectangle r) {
+        this.bounds = r;
+    }
+
+    public Rectangle getBounds() {
+        return bounds;
+    }
+
+    public int compareTo(Cluster o) {
+        return toString().compareTo(o.toString());
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties
new file mode 100644
index 0000000..b7434e0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=Graph
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java
new file mode 100644
index 0000000..8c027b0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Color;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Connection implements Source.Provider, Link {
+
+    public enum ConnectionStyle {
+
+        NORMAL,
+        DASHED,
+        BOLD
+    }
+    private InputSlot inputSlot;
+    private OutputSlot outputSlot;
+    private Source source;
+    private Color color;
+    private ConnectionStyle style;
+    private List<Point> controlPoints;
+
+    protected Connection(InputSlot inputSlot, OutputSlot outputSlot) {
+        this.inputSlot = inputSlot;
+        this.outputSlot = outputSlot;
+        this.inputSlot.connections.add(this);
+        this.outputSlot.connections.add(this);
+        controlPoints = new ArrayList<Point>();
+        Figure sourceFigure = this.outputSlot.getFigure();
+        Figure destFigure = this.inputSlot.getFigure();
+        sourceFigure.addSuccessor(destFigure);
+        destFigure.addPredecessor(sourceFigure);
+        source = new Source();
+
+        this.color = Color.BLACK;
+        this.style = ConnectionStyle.NORMAL;
+    }
+
+    public InputSlot getInputSlot() {
+        return inputSlot;
+    }
+
+    public OutputSlot getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Color getColor() {
+        return color;
+    }
+
+    public ConnectionStyle getStyle() {
+        return style;
+    }
+
+    public void setColor(Color c) {
+        color = c;
+    }
+
+    public void setStyle(ConnectionStyle s) {
+        style = s;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public void remove() {
+        inputSlot.getFigure().removePredecessor(outputSlot.getFigure());
+        inputSlot.connections.remove(this);
+        outputSlot.getFigure().removeSuccessor(inputSlot.getFigure());
+        outputSlot.connections.remove(this);
+    }
+
+    @Override
+    public String toString() {
+        return "Connection(" + getFrom().getVertex() + " to " + getTo().getVertex() + ")";
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public List<Point> getControlPoints() {
+        return controlPoints;
+    }
+
+    public void setControlPoints(List<Point> list) {
+        controlPoints = list;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java
new file mode 100644
index 0000000..00d48f6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Diagram {
+
+    private List<Figure> figures;
+    private Map<InputBlock, Block> blocks;
+    private InputGraph graph;
+    private int curId;
+    private String nodeText;
+    private Font font;
+
+    public Font getFont() {
+        return font;
+    }
+
+    private Diagram() {
+        figures = new ArrayList<Figure>();
+        blocks = new HashMap<InputBlock, Block>();
+        this.nodeText = "";
+        this.font = new Font("Serif", Font.PLAIN, 14);
+    }
+
+    public Block getBlock(InputBlock b) {
+        return blocks.get(b);
+    }
+
+    public String getNodeText() {
+        return nodeText;
+    }
+
+    public void schedule(Collection<InputBlock> newBlocks) {
+        graph.schedule(newBlocks);
+        updateBlocks();
+    }
+
+    private void updateBlocks() {
+        blocks.clear();
+        for (InputBlock b : graph.getBlocks()) {
+            Block curBlock = new Block(b, this);
+            blocks.put(b, curBlock);
+        }
+    }
+
+    public Diagram getNext() {
+        return Diagram.createDiagram(graph.getNext(), nodeText);
+    }
+
+    public Collection<Block> getBlocks() {
+        return Collections.unmodifiableCollection(blocks.values());
+    }
+
+    public Diagram getPrev() {
+        return Diagram.createDiagram(graph.getPrev(), nodeText);
+    }
+
+    public List<Figure> getFigures() {
+        return Collections.unmodifiableList(figures);
+    }
+
+    public Figure createFigure() {
+        Figure f = new Figure(this, curId);
+        curId++;
+        this.figures.add(f);
+        return f;
+    }
+
+    public Connection createConnection(InputSlot inputSlot, OutputSlot outputSlot) {
+        assert inputSlot.getFigure().getDiagram() == this;
+        assert outputSlot.getFigure().getDiagram() == this;
+        return new Connection(inputSlot, outputSlot);
+    }
+
+    public static Diagram createDiagram(InputGraph graph, String nodeText) {
+        if (graph == null) {
+            return null;
+        }
+
+        Diagram d = new Diagram();
+        d.graph = graph;
+        d.nodeText = nodeText;
+
+        d.updateBlocks();
+
+        Collection<InputNode> nodes = graph.getNodes();
+        Hashtable<Integer, Figure> figureHash = new Hashtable<Integer, Figure>();
+        for (InputNode n : nodes) {
+            Figure f = d.createFigure();
+            f.getSource().addSourceNode(n);
+            f.getProperties().add(n.getProperties());
+            figureHash.put(n.getId(), f);
+        }
+
+        for (InputEdge e : graph.getEdges()) {
+
+            int from = e.getFrom();
+            int to = e.getTo();
+            Figure fromFigure = figureHash.get(from);
+            Figure toFigure = figureHash.get(to);
+            assert fromFigure != null && toFigure != null;
+
+            int toIndex = e.getToIndex();
+
+            while (fromFigure.getOutputSlots().size() <= 0) {
+                fromFigure.createOutputSlot();
+            }
+
+            OutputSlot outputSlot = fromFigure.getOutputSlots().get(0);
+
+            while (toFigure.getInputSlots().size() <= toIndex) {
+                toFigure.createInputSlot();
+            }
+
+            InputSlot inputSlot = toFigure.getInputSlots().get(toIndex);
+
+            Connection c = d.createConnection(inputSlot, outputSlot);
+
+            if (e.getState() == InputEdge.State.NEW) {
+                c.setStyle(Connection.ConnectionStyle.BOLD);
+            } else if (e.getState() == InputEdge.State.DELETED) {
+                c.setStyle(Connection.ConnectionStyle.DASHED);
+            }
+        }
+
+
+        return d;
+    }
+
+    public void removeAllFigures(Set<Figure> figuresToRemove) {
+        for (Figure f : figuresToRemove) {
+            freeFigure(f);
+        }
+
+        ArrayList<Figure> newFigures = new ArrayList<Figure>();
+        for (Figure f : this.figures) {
+            if (!figuresToRemove.contains(f)) {
+                newFigures.add(f);
+            }
+        }
+        figures = newFigures;
+    }
+
+    private void freeFigure(Figure succ) {
+
+        List<InputSlot> inputSlots = new ArrayList<InputSlot>(succ.getInputSlots());
+        for (InputSlot s : inputSlots) {
+            succ.removeInputSlot(s);
+        }
+
+        List<OutputSlot> outputSlots = new ArrayList<OutputSlot>(succ.getOutputSlots());
+        for (OutputSlot s : outputSlots) {
+            succ.removeOutputSlot(s);
+        }
+
+        assert succ.getInputSlots().size() == 0;
+        assert succ.getOutputSlots().size() == 0;
+        assert succ.getPredecessors().size() == 0;
+        assert succ.getSuccessors().size() == 0;
+
+    }
+
+    public void removeFigure(Figure succ) {
+
+        assert this.figures.contains(succ);
+        freeFigure(succ);
+        this.figures.remove(succ);
+    }
+
+    public String getName() {
+        return graph.getName();
+    }
+
+    public InputGraph getGraph() {
+        return graph;
+    }
+
+    public Set<Connection> getConnections() {
+
+        Set<Connection> connections = new HashSet<Connection>();
+        for (Figure f : figures) {
+
+            for (InputSlot s : f.getInputSlots()) {
+                connections.addAll(s.getConnections());
+            }
+        }
+
+        return connections;
+    }
+
+    public Figure getRootFigure() {
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(figures);
+        Figure root = selector.selectSingle("name", "Root");
+        if (root == null) {
+            root = selector.selectSingle("name", "Start");
+        }
+        if (root == null) {
+            List<Figure> rootFigures = getRootFigures();
+            if (rootFigures.size() > 0) {
+                root = rootFigures.get(0);
+            } else if (figures.size() > 0) {
+                root = figures.get(0);
+            }
+        }
+
+        return root;
+    }
+
+    public void printStatistics() {
+        System.out.println("=============================================================");
+        System.out.println("Diagram statistics");
+
+        List<Figure> tmpFigures = getFigures();
+        Set<Connection> connections = getConnections();
+
+        System.out.println("Number of figures: " + tmpFigures.size());
+        System.out.println("Number of connections: " + connections.size());
+
+        List<Figure> figuresSorted = new ArrayList<Figure>(tmpFigures);
+        Collections.sort(figuresSorted, new Comparator<Figure>() {
+
+            public int compare(Figure a, Figure b) {
+                return b.getPredecessors().size() + b.getSuccessors().size() - a.getPredecessors().size() - a.getSuccessors().size();
+            }
+        });
+
+        final int COUNT = 10;
+        int z = 0;
+        for (Figure f : figuresSorted) {
+
+            z++;
+            int sum = f.getPredecessors().size() + f.getSuccessors().size();
+            System.out.println("#" + z + ": " + f + ", predCount=" + f.getPredecessors().size() + " succCount=" + f.getSuccessors().size());
+            if (sum < COUNT) {
+                break;
+            }
+
+        }
+
+        System.out.println("=============================================================");
+    }
+
+    public List<Figure> getRootFigures() {
+        ArrayList<Figure> rootFigures = new ArrayList<Figure>();
+        for (Figure f : figures) {
+            if (f.getPredecessors().size() == 0) {
+                rootFigures.add(f);
+            }
+        }
+        return rootFigures;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java
new file mode 100644
index 0000000..cfb913c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Vertex;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Figure extends Properties.Object implements Source.Provider, Vertex {
+
+    public static final int INSET = 6;
+    public static final int SLOT_WIDTH = 10;
+    public static final int SLOT_START = 3;
+    public static final boolean VERTICAL_LAYOUT = true;
+    protected List<InputSlot> inputSlots;
+    protected List<OutputSlot> outputSlots;
+    private Source source;
+    private Diagram diagram;
+    private Point position;
+    private List<Figure> predecessors;
+    private List<Figure> successors;
+    private Color color;
+    private int id;
+    private String idString;
+    private String[] lines;
+    private int heightCash = -1;
+    private int widthCash = -1;
+
+    public int getHeight() {
+        if (heightCash == -1) {
+            BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+            Graphics g = image.getGraphics();
+            g.setFont(diagram.getFont());
+            FontMetrics metrics = g.getFontMetrics();
+            String nodeText = diagram.getNodeText();
+            heightCash = nodeText.split("\n").length * metrics.getHeight() + INSET;
+        }
+        return heightCash;
+    }
+
+    public int getWidth() {
+        if (widthCash == -1) {
+            int max = 0;
+            BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+            Graphics g = image.getGraphics();
+            g.setFont(diagram.getFont());
+            FontMetrics metrics = g.getFontMetrics();
+            for (String s : lines) {
+                int cur = metrics.stringWidth(s);
+                if (cur > max) {
+                    max = cur;
+                }
+            }
+            widthCash = max + INSET;
+        }
+        return widthCash;
+    }
+
+    protected Figure(Diagram diagram, int id) {
+        this.diagram = diagram;
+        this.source = new Source();
+        inputSlots = new ArrayList<InputSlot>(5);
+        outputSlots = new ArrayList<OutputSlot>(1);
+        predecessors = new ArrayList<Figure>(6);
+        successors = new ArrayList<Figure>(6);
+        this.id = id;
+        idString = Integer.toString(id);
+
+        this.position = new Point(0, 0);
+        this.color = Color.WHITE;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setColor(Color color) {
+        this.color = color;
+    }
+
+    public Color getColor() {
+        return color;
+    }
+
+    public List<Figure> getPredecessors() {
+        return Collections.unmodifiableList(predecessors);
+    }
+
+    public Set<Figure> getPredecessorSet() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Figure f : getPredecessors()) {
+            result.add(f);
+        }
+        return Collections.unmodifiableSet(result);
+    }
+
+    public Set<Figure> getSuccessorSet() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Figure f : getSuccessors()) {
+            result.add(f);
+        }
+        return Collections.unmodifiableSet(result);
+    }
+
+    public List<Figure> getSuccessors() {
+        return Collections.unmodifiableList(successors);
+    }
+
+    protected void addPredecessor(Figure f) {
+        this.predecessors.add(f);
+    }
+
+    protected void addSuccessor(Figure f) {
+        this.successors.add(f);
+    }
+
+    protected void removePredecessor(Figure f) {
+        assert predecessors.contains(f);
+        predecessors.remove(f);
+    }
+
+    protected void removeSuccessor(Figure f) {
+        assert successors.contains(f);
+        successors.remove(f);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public Diagram getDiagram() {
+        return diagram;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public InputSlot createInputSlot() {
+        InputSlot slot = new InputSlot(this, -1);
+        inputSlots.add(slot);
+        return slot;
+    }
+
+    public InputSlot createInputSlot(int index) {
+        InputSlot slot = new InputSlot(this, index);
+        inputSlots.add(slot);
+        Collections.sort(inputSlots, Slot.slotIndexComparator);
+        return slot;
+    }
+
+    public void removeSlot(Slot s) {
+
+        assert inputSlots.contains(s) || outputSlots.contains(s);
+
+        List<Connection> connections = new ArrayList<Connection>(s.getConnections());
+        for (Connection c : connections) {
+            c.remove();
+        }
+
+        if (inputSlots.contains(s)) {
+            inputSlots.remove(s);
+        } else if (outputSlots.contains(s)) {
+            outputSlots.remove(s);
+        }
+    }
+
+    public OutputSlot createOutputSlot() {
+        OutputSlot slot = new OutputSlot(this, -1);
+        outputSlots.add(slot);
+        return slot;
+    }
+
+    public OutputSlot createOutputSlot(int index) {
+        OutputSlot slot = new OutputSlot(this, index);
+        outputSlots.add(slot);
+        Collections.sort(outputSlots, Slot.slotIndexComparator);
+        return slot;
+    }
+
+    public List<InputSlot> getInputSlots() {
+        return Collections.unmodifiableList(inputSlots);
+    }
+
+    public List<OutputSlot> getOutputSlots() {
+        return Collections.unmodifiableList(outputSlots);
+    }
+
+    void removeInputSlot(InputSlot s) {
+        s.removeAllConnections();
+        inputSlots.remove(s);
+    }
+
+    void removeOutputSlot(OutputSlot s) {
+        s.removeAllConnections();
+        outputSlots.remove(s);
+    }
+
+    public String[] getLines() {
+        if (lines == null) {
+            updateLines();
+        }
+        return lines;
+    }
+
+    public void updateLines() {
+        String[] strings = diagram.getNodeText().split("\n");
+        String[] result = new String[strings.length];
+
+        for (int i = 0; i < strings.length; i++) {
+            result[i] = resolveString(strings[i]);
+        }
+
+        lines = result;
+    }
+
+    private String resolveString(String string) {
+
+        StringBuilder sb = new StringBuilder();
+        boolean inBrackets = false;
+        StringBuilder curIdent = new StringBuilder();
+
+        for (int i = 0; i < string.length(); i++) {
+            char c = string.charAt(i);
+            if (inBrackets) {
+                if (c == ']') {
+                    String value = getProperties().get(curIdent.toString());
+                    if (value == null) {
+                        value = "";
+                    }
+                    sb.append(value);
+                    inBrackets = false;
+                } else {
+                    curIdent.append(c);
+                }
+            } else {
+                if (c == '[') {
+                    inBrackets = true;
+                    curIdent = new StringBuilder();
+                } else {
+                    sb.append(c);
+                }
+            }
+        }
+
+        return sb.toString();
+    }
+
+    public Dimension getSize() {
+        if (VERTICAL_LAYOUT) {
+            int width = Math.max(getWidth(), Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1));
+            int height = getHeight() + 2 * Figure.SLOT_WIDTH;
+            return new Dimension(width, height);
+        } else {
+            int width = getWidth() + 2 * Figure.SLOT_WIDTH;
+            int height = Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1);
+            return new Dimension(width, height);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return idString;
+    }
+
+    public Cluster getCluster() {
+        if (getSource().getSourceNodes().size() == 0) {
+            assert false : "Should never reach here, every figure must have at least one source node!";
+            return null;
+        } else {
+            Cluster result = diagram.getBlock(diagram.getGraph().getBlock(getSource().getSourceNodes().get(0)));
+            assert result != null;
+            return result;
+        }
+    }
+
+    public boolean isRoot() {
+        if (source.getSourceNodes().size() > 0 && source.getSourceNodes().get(0).getProperties().get("name").equals("Root")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public int compareTo(Vertex f) {
+        return toString().compareTo(f.toString());
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java
new file mode 100644
index 0000000..9ffa077
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlot extends Slot {
+
+    protected InputSlot(Figure figure, int wantedIndex) {
+        super(figure, wantedIndex);
+    }
+
+    public int getPosition() {
+        return getFigure().getInputSlots().indexOf(this);
+    }
+
+    public void setPosition(int position) {
+        List<InputSlot> inputSlots = getFigure().inputSlots;
+        InputSlot s = inputSlots.remove(position);
+        inputSlots.add(position, s);
+    }
+
+    public Point getRelativePosition() {
+        return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getInputSlots().size() + 1), Figure.SLOT_WIDTH - Figure.SLOT_START);
+    }
+
+    @Override
+    public String toString() {
+        return "InputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java
new file mode 100644
index 0000000..8cd8e46
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InvertSelector implements Selector {
+
+    private Selector selector;
+
+    public InvertSelector(Selector selector) {
+        this.selector = selector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+
+        List<Figure> result = new ArrayList<Figure>();
+        List<Figure> otherResult = selector.selected(d);
+        for (Figure f : d.getFigures()) {
+            if (!otherResult.contains(f)) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java
new file mode 100644
index 0000000..7ad17dd
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MatcherSelector implements Selector {
+
+    private PropertyMatcher matcher;
+
+    public MatcherSelector(PropertyMatcher matcher) {
+        this.matcher = matcher;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(d.getFigures());
+        List<Figure> list = selector.selectMultiple(matcher);
+        return list;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java
new file mode 100644
index 0000000..3a7e829
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OrSelector implements Selector {
+
+    private Selector selector1;
+    private Selector selector2;
+
+    /** Creates a new instance of OrSelector */
+    public OrSelector(Selector s1, Selector s2) {
+        this.selector1 = s1;
+        this.selector2 = s2;
+    }
+
+    public List<Figure> selected(Diagram d) {
+
+        List<Figure> l1 = selector1.selected(d);
+        List<Figure> l2 = selector2.selected(d);
+
+        for (Figure f : l2) {
+            if (!l1.contains(f)) {
+                l1.add(f);
+            }
+        }
+
+        return l1;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java
new file mode 100644
index 0000000..b85f3d3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlot extends Slot {
+
+    protected OutputSlot(Figure figure, int wantedIndex) {
+        super(figure, wantedIndex);
+    }
+
+    public int getPosition() {
+        return getFigure().getOutputSlots().indexOf(this);
+    }
+
+    public void setPosition(int position) {
+        OutputSlot s = getFigure().outputSlots.remove(position);
+        getFigure().outputSlots.add(position, s);
+    }
+
+    public Point getRelativePosition() {
+        return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getOutputSlots().size() + 1), getFigure().getSize().height - Figure.SLOT_WIDTH + Figure.SLOT_START);
+    }
+
+    @Override
+    public String toString() {
+        return "OutputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java
new file mode 100644
index 0000000..ab06932
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredecessorSelector implements Selector {
+
+    private Selector innerSelector;
+
+    public PredecessorSelector(Selector innerSelector) {
+        this.innerSelector = innerSelector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> inner = innerSelector.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : d.getFigures()) {
+            boolean saved = false;
+            for (Figure f2 : f.getSuccessors()) {
+                if (inner.contains(f2)) {
+                    saved = true;
+                }
+            }
+
+            if (saved) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java
new file mode 100644
index 0000000..9b47d89
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Selector {
+
+    List<Figure> selected(Diagram d);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java
new file mode 100644
index 0000000..d525dbf
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Comparator;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Slot implements Port, Source.Provider {
+
+    private int wantedIndex;
+    private String name;
+    private String shortName; // 1 - 2 characters
+    private Source source;
+    protected List<Connection> connections;
+    private Figure figure;
+
+    protected Slot(Figure figure, int wantedIndex) {
+        this.figure = figure;
+        connections = new ArrayList<Connection>(2);
+        source = new Source();
+        this.wantedIndex = wantedIndex;
+        name = "";
+        shortName = "";
+        assert figure != null;
+    }
+    public static final Comparator<Slot> slotIndexComparator = new Comparator<Slot>() {
+
+        public int compare(Slot o1, Slot o2) {
+            return o1.wantedIndex - o2.wantedIndex;
+        }
+    };
+    public static final Comparator<Slot> slotFigureComparator = new Comparator<Slot>() {
+
+        public int compare(Slot o1, Slot o2) {
+            return o1.figure.getId() - o2.figure.getId();
+        }
+    };
+
+    public int getWantedIndex() {
+        return wantedIndex;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setShortName(String s) {
+        assert s != null;
+        assert s.length() <= 2;
+        this.shortName = s;
+
+    }
+
+    public String getShortName() {
+        return shortName;
+    }
+
+    public boolean getShowName() {
+        return getShortName() != null && getShortName().length() > 0;
+    }
+
+    public void setName(String s) {
+        if (s == null) {
+            s = "";
+        }
+        this.name = s;
+    }
+
+    public Figure getFigure() {
+        assert figure != null;
+        return figure;
+    }
+
+    public List<Connection> getConnections() {
+        return Collections.unmodifiableList(connections);
+    }
+
+    public void removeAllConnections() {
+        List<Connection> connectionsCopy = new ArrayList<Connection>(this.connections);
+        for (Connection c : connectionsCopy) {
+            c.remove();
+        }
+    }
+
+    public Vertex getVertex() {
+        return figure;
+    }
+
+    public abstract int getPosition();
+
+    public abstract void setPosition(int position);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java
new file mode 100644
index 0000000..a43b905
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Source {
+
+    private List<InputNode> sourceNodes;
+    private Set<Integer> set;
+
+    public Source() {
+        sourceNodes = new ArrayList<InputNode>(1);
+    }
+
+    public List<InputNode> getSourceNodes() {
+        return Collections.unmodifiableList(sourceNodes);
+    }
+
+    public Set<Integer> getSourceNodesAsSet() {
+        if (set == null) {
+            set = new HashSet<Integer>();
+            for (InputNode n : sourceNodes) {
+                int id = n.getId();
+                //if(id < 0) id = -id;
+                set.add(id);
+            }
+        }
+        return set;
+    }
+
+    public void addSourceNode(InputNode n) {
+        sourceNodes.add(n);
+        set = null;
+    }
+
+    public void removeSourceNode(InputNode n) {
+        sourceNodes.remove(n);
+        set = null;
+    }
+
+    public interface Provider {
+
+        public Source getSource();
+    }
+
+    public void setSourceNodes(List<InputNode> sourceNodes) {
+        this.sourceNodes = sourceNodes;
+        set = null;
+    }
+
+    public void addSourceNodes(Source s) {
+        for (InputNode n : s.getSourceNodes()) {
+            sourceNodes.add(n);
+        }
+        set = null;
+    }
+
+    public boolean isInBlock(InputGraph g, InputBlock blockNode) {
+
+        for (InputNode n : this.getSourceNodes()) {
+            if (g.getBlock(n) == blockNode) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java
new file mode 100644
index 0000000..da95a17
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SuccessorSelector implements Selector {
+
+    private Selector innerSelector;
+
+    public SuccessorSelector(Selector innerSelector) {
+        this.innerSelector = innerSelector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> inner = innerSelector.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : d.getFigures()) {
+            boolean saved = false;
+            for (Figure f2 : f.getPredecessors()) {
+                if (inner.contains(f2)) {
+                    saved = true;
+                }
+            }
+
+            if (saved) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml
new file mode 100644
index 0000000..8376e08
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.hierarchicallayout" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.hierarchicallayout.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf
new file mode 100644
index 0000000..723afd1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.hierarchicallayout

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/hierarchicallayout/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml
new file mode 100644
index 0000000..3257988
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.hierarchicallayout-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties
new file mode 100644
index 0000000..cb74676
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=de087df9
+build.xml.script.CRC32=98977c36
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=de087df9
+nbproject/build-impl.xml.script.CRC32=0d734625
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml
new file mode 100644
index 0000000..fc4c20a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.hierarchicallayout</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties
new file mode 100644
index 0000000..0372231
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=HierarchicalLayout
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java
new file mode 100644
index 0000000..343cc65
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterEdge implements Link {
+
+    private ClusterNode from;
+    private ClusterNode to;
+    private List<Point> points;
+
+    public ClusterEdge(ClusterNode from, ClusterNode to) {
+        assert from != null;
+        assert to != null;
+        this.from = from;
+        this.to = to;
+    }
+
+    public Port getTo() {
+        return to.getInputSlot();
+    }
+
+    public Port getFrom() {
+        return from.getInputSlot();
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.points = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return points;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java
new file mode 100644
index 0000000..e658877
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterIngoingConnection implements Link {
+
+    private List<Point> controlPoints;
+    private ClusterInputSlotNode inputSlotNode;
+    private Link connection;
+    private Port inputSlot;
+    private Port outputSlot;
+
+    public ClusterIngoingConnection(ClusterInputSlotNode inputSlotNode, Link c) {
+        this.inputSlotNode = inputSlotNode;
+        this.connection = c;
+        this.controlPoints = new ArrayList<Point>();
+
+        inputSlot = c.getTo();
+        outputSlot = inputSlotNode.getOutputSlot();
+    }
+
+    public Link getConnection() {
+        return connection;
+    }
+
+    public ClusterInputSlotNode getInputSlotNode() {
+        return inputSlotNode;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.controlPoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return controlPoints;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java
new file mode 100644
index 0000000..8458ed5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterInputSlotNode implements Vertex {
+
+    private final int SIZE = 0;
+    private Point position;
+    private Port inputSlot;
+    private Port outputSlot;
+    private ClusterNode blockNode;
+    private InterClusterConnection interBlockConnection;
+    private Cluster cluster;
+    private ClusterIngoingConnection conn;
+
+    public void setIngoingConnection(ClusterIngoingConnection c) {
+        conn = c;
+    }
+
+    public ClusterIngoingConnection getIngoingConnection() {
+        return conn;
+    }
+    private String id;
+
+    @Override
+    public String toString() {
+        return id;
+    }
+
+    public ClusterInputSlotNode(ClusterNode n, String id) {
+        this.blockNode = n;
+        this.id = id;
+
+        n.addSubNode(this);
+
+        final Vertex thisNode = this;
+        final ClusterNode thisBlockNode = blockNode;
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(0, 0);
+            }
+
+            public Vertex getVertex() {
+                return thisNode;
+            }
+
+            @Override
+            public String toString() {
+                return "OutPort of " + thisNode.toString();
+            }
+        };
+
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                Point p = new Point(thisNode.getPosition());
+                p.x += ClusterNode.BORDER;
+                p.y = 0;
+                return p;
+            }
+
+            public Vertex getVertex() {
+                return thisBlockNode;
+            }
+
+            @Override
+            public String toString() {
+                return "InPort of " + thisNode.toString();
+            }
+        };
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public InterClusterConnection getInterBlockConnection() {
+        return interBlockConnection;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Dimension getSize() {
+        return new Dimension(SIZE, SIZE);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public void setInterBlockConnection(InterClusterConnection interBlockConnection) {
+        this.interBlockConnection = interBlockConnection;
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return true;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java
new file mode 100644
index 0000000..315ff82
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterNode implements Vertex {
+
+    private Cluster cluster;
+    private Port inputSlot;
+    private Port outputSlot;
+    private Set<Vertex> subNodes;
+    private Dimension size;
+    private Point position;
+    private Set<Link> subEdges;
+    private boolean dirty;
+    private boolean root;
+    private String name;
+    public static final int BORDER = 20;
+
+    public ClusterNode(Cluster cluster, String name) {
+        this.subNodes = new HashSet<Vertex>();
+        this.subEdges = new HashSet<Link>();
+        this.cluster = cluster;
+        position = new Point(0, 0);
+        this.name = name;
+    }
+
+    public void addSubNode(Vertex v) {
+        subNodes.add(v);
+    }
+
+    public void addSubEdge(Link l) {
+        subEdges.add(l);
+    }
+
+    public Set<Link> getSubEdges() {
+        return Collections.unmodifiableSet(subEdges);
+    }
+
+    public void updateSize() {
+
+
+        calculateSize();
+
+        final ClusterNode widget = this;
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(size.width / 2, 0);
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(size.width / 2, size.height);
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+    }
+
+    private void calculateSize() {
+
+        if (subNodes.size() == 0) {
+            size = new Dimension(0, 0);
+        }
+
+        int minX = Integer.MAX_VALUE;
+        int maxX = Integer.MIN_VALUE;
+        int minY = Integer.MAX_VALUE;
+        int maxY = Integer.MIN_VALUE;
+
+
+        for (Vertex n : subNodes) {
+            Point p = n.getPosition();
+            minX = Math.min(minX, p.x);
+            minY = Math.min(minY, p.y);
+            maxX = Math.max(maxX, p.x + n.getSize().width);
+            maxY = Math.max(maxY, p.y + n.getSize().height);
+        }
+
+        for (Link l : subEdges) {
+            List<Point> points = l.getControlPoints();
+            for (Point p : points) {
+                if (p != null) {
+                    minX = Math.min(minX, p.x);
+                    maxX = Math.max(maxX, p.x);
+                    minY = Math.min(minY, p.y);
+                    maxY = Math.max(maxY, p.y);
+                }
+            }
+        }
+
+        size = new Dimension(maxX - minX, maxY - minY);
+
+        // Normalize coordinates
+        for (Vertex n : subNodes) {
+            n.setPosition(new Point(n.getPosition().x - minX, n.getPosition().y - minY));
+        }
+
+        for (Link l : subEdges) {
+            List<Point> points = new ArrayList<Point>(l.getControlPoints());
+            for (Point p : points) {
+                p.x -= minX;
+                p.y -= minY;
+            }
+            l.setControlPoints(points);
+
+        }
+
+        size.width += 2 * BORDER;
+        size.height += 2 * BORDER;
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Dimension getSize() {
+        return size;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public void setPosition(Point pos) {
+
+        this.position = pos;
+        for (Vertex n : subNodes) {
+            Point cur = new Point(n.getPosition());
+            cur.translate(pos.x + BORDER, pos.y + BORDER);
+            n.setPosition(cur);
+        }
+
+        for (Link e : subEdges) {
+            List<Point> arr = e.getControlPoints();
+            ArrayList<Point> newArr = new ArrayList<Point>();
+            for (Point p : arr) {
+                if (p != null) {
+                    Point p2 = new Point(p);
+                    p2.translate(pos.x + BORDER, pos.y + BORDER);
+                    newArr.add(p2);
+                } else {
+                    newArr.add(null);
+                }
+            }
+
+            e.setControlPoints(newArr);
+        }
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setDirty(boolean b) {
+        dirty = b;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+    public Set<? extends Vertex> getSubNodes() {
+        return subNodes;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java
new file mode 100644
index 0000000..babf2f2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutgoingConnection implements Link {
+
+    private List<Point> intermediatePoints;
+    private ClusterOutputSlotNode outputSlotNode;
+    private Link connection;
+    private Port inputSlot;
+    private Port outputSlot;
+
+    public ClusterOutgoingConnection(ClusterOutputSlotNode outputSlotNode, Link c) {
+        this.outputSlotNode = outputSlotNode;
+        this.connection = c;
+        this.intermediatePoints = new ArrayList<Point>();
+
+        outputSlot = c.getFrom();
+        inputSlot = outputSlotNode.getInputSlot();
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.intermediatePoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return intermediatePoints;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java
new file mode 100644
index 0000000..924c9e0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutputSlotNode implements Vertex {
+
+    private final int SIZE = 0;
+    private Point position;
+    private Port inputSlot;
+    private Port outputSlot;
+    private ClusterNode blockNode;
+    private boolean root;
+    private Cluster cluster;
+    private ClusterOutgoingConnection conn;
+    private String id;
+
+    public void setOutgoingConnection(ClusterOutgoingConnection c) {
+        this.conn = c;
+    }
+
+    public ClusterOutgoingConnection getOutgoingConnection() {
+        return conn;
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+
+    public ClusterOutputSlotNode(ClusterNode n, String id) {
+        this.blockNode = n;
+        this.id = id;
+
+        n.addSubNode(this);
+
+        final Vertex thisNode = this;
+        final ClusterNode thisBlockNode = blockNode;
+
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(0, 0);
+            }
+
+            public Vertex getVertex() {
+                return thisNode;
+            }
+
+            @Override
+            public String toString() {
+                return "InPort of " + thisNode.toString();
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                Point p = new Point(thisNode.getPosition());
+                p.x += ClusterNode.BORDER;
+                p.y = thisBlockNode.getSize().height;
+                return p;
+            }
+
+            public Vertex getVertex() {
+                return thisBlockNode;
+            }
+
+            @Override
+            public String toString() {
+                return "OutPort of " + thisNode.toString();
+            }
+        };
+    }
+
+    public Dimension getSize() {
+        return new Dimension(SIZE, SIZE);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java
new file mode 100644
index 0000000..2c11ce6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Edge<N, E> {
+
+    private E data;
+    private Node<N, E> source;
+    private Node<N, E> dest;
+
+    protected Edge(Graph<N, E> graph, Node<N, E> source, Node<N, E> dest, E data) {
+        setData(data);
+        this.source = source;
+        this.dest = dest;
+        assert source != null;
+        assert dest != null;
+        assert source.getGraph() == dest.getGraph();
+        assert source.getGraph() != null;
+        assert dest.getGraph() != null;
+    }
+
+    public Node<N, E> getSource() {
+        return source;
+    }
+
+    public Node<N, E> getDest() {
+        return dest;
+    }
+
+    public E getData() {
+        return data;
+    }
+
+    public void setData(E e) {
+        data = e;
+    }
+
+    public void remove() {
+        source.getGraph().removeEdge(this, null);
+    }
+
+    public boolean isSelfLoop() {
+        return source == dest;
+    }
+
+    public void reverse() {
+
+        // Remove from current source / dest
+        source.removeOutEdge(this);
+        dest.removeInEdge(this);
+
+        Node<N, E> tmp = source;
+        source = dest;
+        dest = tmp;
+
+        // Add to new source / dest
+        source.addOutEdge(this);
+        dest.addInEdge(this);
+    }
+
+    public String toString() {
+        return "Edge (" + source + " -- " + dest + "): " + data;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java
new file mode 100644
index 0000000..98dbe39
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Graph<N, E> {
+
+    private Hashtable<Object, Node<N, E>> nodes;
+    private Hashtable<Object, Edge<N, E>> edges;
+    private List<Node<N, E>> nodeList;
+
+    public Graph() {
+        nodes = new Hashtable<Object, Node<N, E>>();
+        edges = new Hashtable<Object, Edge<N, E>>();
+        nodeList = new ArrayList<Node<N, E>>();
+    }
+
+    public Node<N, E> createNode(N data, Object key) {
+        Node<N, E> n = new Node<N, E>(this, data);
+        assert key == null || !nodes.containsKey(key);
+        if (key != null) {
+            nodes.put(key, n);
+        }
+        nodeList.add(n);
+        return n;
+    }
+
+    public Edge<N, E> createEdge(Node<N, E> source, Node<N, E> dest, E data, Object key) {
+        Edge<N, E> e = new Edge<N, E>(this, source, dest, data);
+        source.addOutEdge(e);
+        dest.addInEdge(e);
+        if (key != null) {
+            edges.put(key, e);
+        }
+        return e;
+    }
+
+    public Node<N, E> getNode(Object key) {
+        return nodes.get(key);
+    }
+
+    public Edge<N, E> getEdge(Object key) {
+        return edges.get(key);
+    }
+
+    public Collection<Edge<N, E>> getEdges() {
+        return Collections.unmodifiableCollection(edges.values());
+    }
+
+    public Collection<Node<N, E>> getNodes() {
+        return Collections.unmodifiableList(nodeList);
+    }
+
+    public void removeEdge(Edge<N, E> e, Object key) {
+        assert key == null || edges.containsKey(key);
+        if (key != null) {
+            edges.remove(key);
+        }
+        e.getSource().removeOutEdge(e);
+        e.getDest().removeInEdge(e);
+    }
+
+    public class DFSTraversalVisitor {
+
+        public void visitNode(Node<N, E> n) {
+        }
+
+        public boolean visitEdge(Edge<N, E> e, boolean backEdge) {
+            return true;
+        }
+    }
+
+    public class BFSTraversalVisitor {
+
+        public void visitNode(Node<N, E> n, int depth) {
+        }
+    }
+
+    public List<Node<N, E>> getNodesWithInDegree(int x) {
+        return getNodesWithInDegree(x, true);
+    }
+
+    public List<Node<N, E>> getNodesWithInDegree(int x, boolean countSelfLoops) {
+
+        List<Node<N, E>> result = new ArrayList<Node<N, E>>();
+        for (Node<N, E> n : getNodes()) {
+            if (n.getInDegree(countSelfLoops) == x) {
+                result.add(n);
+            }
+        }
+
+        return result;
+
+    }
+
+    private void markReachable(Node<N, E> startingNode) {
+        ArrayList<Node<N, E>> arr = new ArrayList<Node<N, E>>();
+        arr.add(startingNode);
+        for (Node<N, E> n : getNodes()) {
+            n.setReachable(false);
+        }
+        traverseDFS(arr, new DFSTraversalVisitor() {
+
+            @Override
+            public void visitNode(Node<N, E> n) {
+                n.setReachable(true);
+            }
+        });
+    }
+
+    public void traverseBFS(Node<N, E> startingNode, BFSTraversalVisitor tv, boolean longestPath) {
+
+        if (longestPath) {
+            markReachable(startingNode);
+        }
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        Queue<Node<N, E>> queue = new LinkedList<Node<N, E>>();
+        queue.add(startingNode);
+        startingNode.setVisited(true);
+        int layer = 0;
+        Node<N, E> lastOfLayer = startingNode;
+        Node<N, E> lastAdded = null;
+
+        while (!queue.isEmpty()) {
+
+            Node<N, E> current = queue.poll();
+            tv.visitNode(current, layer);
+            current.setActive(false);
+
+
+            for (Edge<N, E> e : current.getOutEdges()) {
+                if (!e.getDest().isVisited()) {
+
+                    boolean allow = true;
+                    if (longestPath) {
+                        for (Node<N, E> pred : e.getDest().getPredecessors()) {
+                            if ((!pred.isVisited() || pred.isActive()) && pred.isReachable()) {
+                                allow = false;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (allow) {
+                        queue.offer(e.getDest());
+                        lastAdded = e.getDest();
+                        e.getDest().setVisited(true);
+                        e.getDest().setActive(true);
+                    }
+                }
+            }
+
+            if (current == lastOfLayer && !queue.isEmpty()) {
+                lastOfLayer = lastAdded;
+                layer++;
+            }
+        }
+    }
+
+    public void traverseDFS(DFSTraversalVisitor tv) {
+        traverseDFS(getNodes(), tv);
+    }
+
+    public void traverseDFS(Collection<Node<N, E>> startingNodes, DFSTraversalVisitor tv) {
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        boolean result = false;
+        for (Node<N, E> n : startingNodes) {
+            traverse(tv, n);
+        }
+    }
+
+    private void traverse(DFSTraversalVisitor tv, Node<N, E> n) {
+
+        if (!n.isVisited()) {
+            n.setVisited(true);
+            n.setActive(true);
+            tv.visitNode(n);
+
+            for (Edge<N, E> e : n.getOutEdges()) {
+
+                Node<N, E> next = e.getDest();
+                if (next.isActive()) {
+                    tv.visitEdge(e, true);
+                } else {
+                    if (tv.visitEdge(e, false)) {
+                        traverse(tv, next);
+                    }
+                }
+            }
+
+            n.setActive(false);
+        }
+
+    }
+
+    public boolean hasCycles() {
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        boolean result = false;
+        for (Node<N, E> n : getNodes()) {
+            result |= checkCycles(n);
+            if (result) {
+                break;
+            }
+        }
+        return result;
+    }
+
+    private boolean checkCycles(Node<N, E> n) {
+
+        if (n.isActive()) {
+            return true;
+        }
+
+        if (!n.isVisited()) {
+
+            n.setVisited(true);
+            n.setActive(true);
+
+            for (Node<N, E> succ : n.getSuccessors()) {
+                if (checkCycles(succ)) {
+                    return true;
+                }
+            }
+
+            n.setActive(false);
+
+        }
+
+        return false;
+    }
+
+    @Override
+    public String toString() {
+
+        StringBuilder s = new StringBuilder();
+        s.append("Nodes: ");
+        for (Node<N, E> n : getNodes()) {
+            s.append(n.toString());
+            s.append("\n");
+        }
+
+        s.append("Edges: ");
+
+        for (Edge<N, E> e : getEdges()) {
+            s.append(e.toString());
+            s.append("\n");
+        }
+
+        return s.toString();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java
new file mode 100644
index 0000000..1dc1b36
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.TreeSet;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalClusterLayoutManager implements LayoutManager {
+
+    private OldHierarchicalLayoutManager.Combine combine;
+    private LayoutManager subManager = new OldHierarchicalLayoutManager(combine);
+    private LayoutManager manager = new OldHierarchicalLayoutManager(combine, 150);
+    private static final boolean TRACE = false;
+
+    public HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine combine) {
+        this.combine = combine;
+    }
+
+    public void doLayout(LayoutGraph graph) {
+        doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+    }
+
+    public void setSubManager(LayoutManager manager) {
+        this.subManager = manager;
+    }
+
+    public void setManager(LayoutManager manager) {
+        this.manager = manager;
+    }
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+        assert graph.verify();
+
+        Hashtable<Cluster, List<Vertex>> lists = new Hashtable<Cluster, List<Vertex>>();
+        Hashtable<Cluster, List<Link>> listsConnection = new Hashtable<Cluster, List<Link>>();
+        Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>> clusterInputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>>();
+        Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>> clusterOutputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>>();
+
+        Hashtable<Cluster, ClusterNode> clusterNodes = new Hashtable<Cluster, ClusterNode>();
+        Hashtable<Cluster, Set<ClusterInputSlotNode>> clusterInputSlotSet = new Hashtable<Cluster, Set<ClusterInputSlotNode>>();
+        Hashtable<Cluster, Set<ClusterOutputSlotNode>> clusterOutputSlotSet = new Hashtable<Cluster, Set<ClusterOutputSlotNode>>();
+        Set<Link> clusterEdges = new HashSet<Link>();
+        Set<Link> interClusterEdges = new HashSet<Link>();
+        Hashtable<Link, ClusterOutgoingConnection> linkClusterOutgoingConnection = new Hashtable<Link, ClusterOutgoingConnection>();
+        Hashtable<Link, InterClusterConnection> linkInterClusterConnection = new Hashtable<Link, InterClusterConnection>();
+        Hashtable<Link, ClusterIngoingConnection> linkClusterIngoingConnection = new Hashtable<Link, ClusterIngoingConnection>();
+        Set<ClusterNode> clusterNodeSet = new HashSet<ClusterNode>();
+
+        Set<Cluster> cluster = graph.getClusters();
+        int z = 0;
+        for (Cluster c : cluster) {
+            lists.put(c, new ArrayList<Vertex>());
+            listsConnection.put(c, new ArrayList<Link>());
+            clusterInputSlotHash.put(c, new Hashtable<Port, ClusterInputSlotNode>());
+            clusterOutputSlotHash.put(c, new Hashtable<Port, ClusterOutputSlotNode>());
+            clusterOutputSlotSet.put(c, new TreeSet<ClusterOutputSlotNode>());
+            clusterInputSlotSet.put(c, new TreeSet<ClusterInputSlotNode>());
+            ClusterNode cn = new ClusterNode(c, "" + z);
+            clusterNodes.put(c, cn);
+            clusterNodeSet.add(cn);
+            z++;
+        }
+
+        // Add cluster edges
+        for (Cluster c : cluster) {
+
+            ClusterNode start = clusterNodes.get(c);
+
+            for (Cluster succ : c.getSuccessors()) {
+                ClusterNode end = clusterNodes.get(succ);
+                if (end != null && start != end) {
+                    ClusterEdge e = new ClusterEdge(start, end);
+                    clusterEdges.add(e);
+                    interClusterEdges.add(e);
+                }
+            }
+        }
+
+        for (Vertex v : graph.getVertices()) {
+            Cluster c = v.getCluster();
+            assert c != null;
+            clusterNodes.get(c).addSubNode(v);
+        }
+
+        for (Link l : graph.getLinks()) {
+
+            Port fromPort = l.getFrom();
+            Port toPort = l.getTo();
+            Vertex fromVertex = fromPort.getVertex();
+            Vertex toVertex = toPort.getVertex();
+            Cluster fromCluster = fromVertex.getCluster();
+            Cluster toCluster = toVertex.getCluster();
+
+            Port samePort = null;
+            if (combine == OldHierarchicalLayoutManager.Combine.SAME_INPUTS) {
+                samePort = toPort;
+            } else if (combine == OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS) {
+                samePort = fromPort;
+            }
+
+            assert listsConnection.containsKey(fromCluster);
+            assert listsConnection.containsKey(toCluster);
+
+            if (fromCluster == toCluster) {
+                listsConnection.get(fromCluster).add(l);
+                clusterNodes.get(fromCluster).addSubEdge(l);
+            } else {
+                ClusterInputSlotNode inputSlotNode = null;
+                ClusterOutputSlotNode outputSlotNode = null;
+
+                if (samePort != null) {
+                    outputSlotNode = clusterOutputSlotHash.get(fromCluster).get(samePort);
+                    inputSlotNode = clusterInputSlotHash.get(toCluster).get(samePort);
+                }
+
+                if (outputSlotNode == null) {
+                    outputSlotNode = new ClusterOutputSlotNode(clusterNodes.get(fromCluster), "Out " + fromCluster.toString() + " " + samePort.toString());
+                    clusterOutputSlotSet.get(fromCluster).add(outputSlotNode);
+                    ClusterOutgoingConnection conn = new ClusterOutgoingConnection(outputSlotNode, l);
+                    outputSlotNode.setOutgoingConnection(conn);
+                    clusterNodes.get(fromCluster).addSubEdge(conn);
+                    if (samePort != null) {
+                        clusterOutputSlotHash.get(fromCluster).put(samePort, outputSlotNode);
+                    }
+
+                    linkClusterOutgoingConnection.put(l, conn);
+                } else {
+                    linkClusterOutgoingConnection.put(l, outputSlotNode.getOutgoingConnection());
+                }
+
+                if (inputSlotNode == null) {
+                    inputSlotNode = new ClusterInputSlotNode(clusterNodes.get(toCluster), "In " + toCluster.toString() + " " + samePort.toString());
+                    clusterInputSlotSet.get(toCluster).add(inputSlotNode);
+                }
+
+                ClusterIngoingConnection conn = new ClusterIngoingConnection(inputSlotNode, l);
+                inputSlotNode.setIngoingConnection(conn);
+                clusterNodes.get(toCluster).addSubEdge(conn);
+                if (samePort != null) {
+                    clusterInputSlotHash.get(toCluster).put(samePort, inputSlotNode);
+                }
+
+                linkClusterIngoingConnection.put(l, conn);
+
+
+                InterClusterConnection interConn = new InterClusterConnection(outputSlotNode, inputSlotNode);
+                linkInterClusterConnection.put(l, interConn);
+                clusterEdges.add(interConn);
+            }
+        }
+
+        Timing t = null;
+
+        if (TRACE) {
+            new Timing("Child timing");
+            t.start();
+        }
+
+        for (Cluster c : cluster) {
+            ClusterNode n = clusterNodes.get(c);
+            subManager.doLayout(new LayoutGraph(n.getSubEdges(), n.getSubNodes()), clusterInputSlotSet.get(c), clusterOutputSlotSet.get(c), new HashSet<Link>());
+            n.updateSize();
+        }
+
+        Set<Vertex> roots = new LayoutGraph(interClusterEdges).findRootVertices();
+        for (Vertex v : roots) {
+            assert v instanceof ClusterNode;
+            ((ClusterNode) v).setRoot(true);
+        }
+
+        manager.doLayout(new LayoutGraph(clusterEdges, clusterNodeSet), new HashSet<Vertex>(), new HashSet<Vertex>(), interClusterEdges);
+
+        for (Cluster c : cluster) {
+            ClusterNode n = clusterNodes.get(c);
+            c.setBounds(new Rectangle(n.getPosition(), n.getSize()));
+        }
+
+        // TODO: handle case where blocks are not fully connected
+
+        if (TRACE) {
+            t.stop();
+            t.print();
+        }
+
+        for (Link l : graph.getLinks()) {
+
+            if (linkInterClusterConnection.containsKey(l)) {
+                ClusterOutgoingConnection conn1 = linkClusterOutgoingConnection.get(l);
+                InterClusterConnection conn2 = linkInterClusterConnection.get(l);
+                ClusterIngoingConnection conn3 = linkClusterIngoingConnection.get(l);
+
+                assert conn1 != null;
+                assert conn2 != null;
+                assert conn3 != null;
+
+                List<Point> points = new ArrayList<Point>();
+
+                points.addAll(conn1.getControlPoints());
+                points.addAll(conn2.getControlPoints());
+                points.addAll(conn3.getControlPoints());
+
+                l.setControlPoints(points);
+            }
+        }
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java
new file mode 100644
index 0000000..9e5656f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java
@@ -0,0 +1,2110 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.Stack;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalLayoutManager implements LayoutManager {
+
+    public static final boolean TRACE = false;
+    public static final boolean CHECK = false;
+    public static final int SWEEP_ITERATIONS = 1;
+    public static final int CROSSING_ITERATIONS = 2;
+    public static final int DUMMY_HEIGHT = 1;
+    public static final int DUMMY_WIDTH = 1;
+    public static final int X_OFFSET = 9;
+    public static final int LAYER_OFFSET = 30;
+    public static final int MAX_LAYER_LENGTH = -1;
+    public static final int MIN_LAYER_DIFFERENCE = 1;
+
+    public enum Combine {
+
+        NONE,
+        SAME_INPUTS,
+        SAME_OUTPUTS
+    }
+    // Options
+    private Combine combine;
+    private int dummyWidth;
+    private int dummyHeight;
+    private int xOffset;
+    private int layerOffset;
+    private int maxLayerLength;
+    private int minLayerDifference;
+    // Algorithm global datastructures
+    private Set<Link> reversedLinks;
+    private List<LayoutNode> nodes;
+    private HashMap<Vertex, LayoutNode> vertexToLayoutNode;
+    private HashMap<Link, List<Point>> reversedLinkStartPoints;
+    private HashMap<Link, List<Point>> reversedLinkEndPoints;
+    private HashMap<LayoutEdge, LayoutEdge> bottomEdgeHash;
+    private HashMap<Link, List<Point>> splitStartPoints;
+    private HashMap<Link, List<Point>> splitEndPoints;
+    private LayoutGraph graph;
+    private List<LayoutNode>[] layers;
+    private int layerCount;
+    private Set<? extends Vertex> firstLayerHint;
+    private Set<? extends Vertex> lastLayerHint;
+    private Set<? extends Link> importantLinks;
+    private Set<Link> linksToFollow;
+
+    private class LayoutNode {
+
+        public int x;
+        public int y;
+        public int width;
+        public int height;
+        public int layer = -1;
+        public int xOffset;
+        public int yOffset;
+        public int bottomYOffset;
+        public Vertex vertex; // Only used for non-dummy nodes, otherwise null
+        public List<LayoutEdge> preds = new ArrayList<LayoutEdge>();
+        public List<LayoutEdge> succs = new ArrayList<LayoutEdge>();
+        public HashMap<Integer, Integer> outOffsets = new HashMap<Integer, Integer>();
+        public HashMap<Integer, Integer> inOffsets = new HashMap<Integer, Integer>();
+        public int pos = -1; // Position within layer
+        public int crossingNumber;
+
+        @Override
+        public String toString() {
+            return "Node " + vertex;
+        }
+    }
+
+    private class LayoutEdge {
+
+        public LayoutNode from;
+        public LayoutNode to;
+        public int relativeFrom;
+        public int relativeTo;
+        public Link link;
+    }
+
+    private abstract class AlgorithmPart {
+
+        public void start() {
+            if (CHECK) {
+                preCheck();
+            }
+
+            long start = 0;
+            if (TRACE) {
+                System.out.println("##################################################");
+                System.out.println("Starting part " + this.getClass().getName());
+                start = System.currentTimeMillis();
+            }
+            run();
+            if (TRACE) {
+                System.out.println("Timing for " + this.getClass().getName() + " is " + (System.currentTimeMillis() - start));
+                printStatistics();
+            }
+
+            if (CHECK) {
+                postCheck();
+            }
+        }
+
+        protected abstract void run();
+
+        protected void printStatistics() {
+        }
+
+        protected void postCheck() {
+        }
+
+        protected void preCheck() {
+        }
+    }
+
+    public HierarchicalLayoutManager() {
+        this(Combine.NONE);
+    }
+
+    public HierarchicalLayoutManager(Combine b) {
+        this.combine = b;
+        this.dummyWidth = DUMMY_WIDTH;
+        this.dummyHeight = DUMMY_HEIGHT;
+        this.xOffset = X_OFFSET;
+        this.layerOffset = LAYER_OFFSET;
+        this.maxLayerLength = MAX_LAYER_LENGTH;
+        this.minLayerDifference = MIN_LAYER_DIFFERENCE;
+        this.linksToFollow = new HashSet<Link>();
+    }
+
+    public int getMaxLayerLength() {
+        return maxLayerLength;
+    }
+
+    public void setMaxLayerLength(int v) {
+        maxLayerLength = v;
+    }
+
+    public void setMinLayerDifference(int v) {
+        minLayerDifference = v;
+    }
+
+    public void doLayout(LayoutGraph graph) {
+        doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+
+    }
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+        this.importantLinks = importantLinks;
+        this.graph = graph;
+        this.firstLayerHint = firstLayerHint;
+        this.lastLayerHint = lastLayerHint;
+
+        vertexToLayoutNode = new HashMap<Vertex, LayoutNode>();
+        reversedLinks = new HashSet<Link>();
+        reversedLinkStartPoints = new HashMap<Link, List<Point>>();
+        reversedLinkEndPoints = new HashMap<Link, List<Point>>();
+        bottomEdgeHash = new HashMap<LayoutEdge, LayoutEdge>();
+        nodes = new ArrayList<LayoutNode>();
+        splitStartPoints = new HashMap<Link, List<Point>>();
+        splitEndPoints = new HashMap<Link, List<Point>>();
+
+        // #############################################################
+        // Step 1: Build up data structure
+        new BuildDatastructure().start();
+
+        // #############################################################
+        // STEP 2: Reverse edges, handle backedges
+        new ReverseEdges().start();
+
+        for (LayoutNode n : nodes) {
+            ArrayList<LayoutEdge> tmpArr = new ArrayList<LayoutEdge>();
+            for (LayoutEdge e : n.succs) {
+                if (importantLinks.contains(e.link)) {
+                    tmpArr.add(e);
+                }
+            }
+
+            for (LayoutEdge e : tmpArr) {
+                //System.out.println("Removed " + e);
+                e.from.succs.remove(e);
+                e.to.preds.remove(e);
+            }
+        }
+
+        // #############################################################
+        // STEP 3: Assign layers
+        new AssignLayers().start();
+
+        // #############################################################
+        // STEP 4: Create dummy nodes
+        new CreateDummyNodes().start();
+
+        // #############################################################
+        // STEP 5: Crossing Reduction
+        new CrossingReduction().start();
+
+        // #############################################################
+        // STEP 7: Assign X coordinates
+        //new AssignXCoordinates().start();
+        new AssignXCoordinates2().start();
+
+        // #############################################################
+        // STEP 6: Assign Y coordinates
+        new AssignYCoordinates().start();
+
+        // #############################################################
+        // STEP 8: Write back to interface
+        new WriteResult().start();
+    }
+
+    private class WriteResult extends AlgorithmPart {
+
+        private int pointCount;
+
+        protected void run() {
+
+            HashMap<Vertex, Point> vertexPositions = new HashMap<Vertex, Point>();
+            HashMap<Link, List<Point>> linkPositions = new HashMap<Link, List<Point>>();
+            for (Vertex v : graph.getVertices()) {
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert !vertexPositions.containsKey(v);
+                vertexPositions.put(v, new Point(n.x + n.xOffset, n.y + n.yOffset));
+            }
+
+            for (LayoutNode n : nodes) {
+
+                for (LayoutEdge e : n.preds) {
+                    if (e.link != null) {
+                        ArrayList<Point> points = new ArrayList<Point>();
+
+                        Point p = new Point(e.to.x + e.relativeTo, e.to.y + e.to.yOffset);
+                        points.add(p);
+                        if (e.to.inOffsets.containsKey(e.relativeTo)) {
+                            points.add(new Point(p.x, p.y + e.to.inOffsets.get(e.relativeTo)));
+                        }
+
+                        LayoutNode cur = e.from;
+                        LayoutNode other = e.to;
+                        LayoutEdge curEdge = e;
+                        while (cur.vertex == null && cur.preds.size() != 0) {
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y));
+                            assert cur.preds.size() == 1;
+                            curEdge = cur.preds.get(0);
+                            cur = curEdge.from;
+                        }
+
+                        p = new Point(cur.x + curEdge.relativeFrom, cur.y + cur.height - cur.bottomYOffset);
+                        if (curEdge.from.outOffsets.containsKey(curEdge.relativeFrom)) {
+                            points.add(new Point(p.x, p.y + curEdge.from.outOffsets.get(curEdge.relativeFrom)));
+                        }
+                        points.add(p);
+
+                        Collections.reverse(points);
+
+
+
+                        if (cur.vertex == null && cur.preds.size() == 0) {
+
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + e.to.x, p1.y + e.to.y));
+                                }
+                            }
+
+                            if (splitStartPoints.containsKey(e.link)) {
+                                points.add(0, null);
+                                points.addAll(0, splitStartPoints.get(e.link));
+
+                                //checkPoints(points);
+                                if (reversedLinks.contains(e.link)) {
+                                    Collections.reverse(points);
+                                }
+                                assert !linkPositions.containsKey(e.link);
+                                linkPositions.put(e.link, points);
+                            } else {
+                                splitEndPoints.put(e.link, points);
+                            }
+
+                        } else {
+                            if (reversedLinks.contains(e.link)) {
+                                Collections.reverse(points);
+                            }
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+                                }
+                            }
+
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+
+                            assert !linkPositions.containsKey(e.link);
+                            linkPositions.put(e.link, points);
+                        }
+                        pointCount += points.size();
+
+                        // No longer needed!
+                        e.link = null;
+                    }
+                }
+
+                for (LayoutEdge e : n.succs) {
+                    if (e.link != null) {
+                        ArrayList<Point> points = new ArrayList<Point>();
+                        Point p = new Point(e.from.x + e.relativeFrom, e.from.y + e.from.height - e.from.bottomYOffset);
+                        points.add(p);
+                        if (e.from.outOffsets.containsKey(e.relativeFrom)) {
+                            points.add(new Point(p.x, p.y + e.from.outOffsets.get(e.relativeFrom)));
+                        }
+
+                        LayoutNode cur = e.to;
+                        LayoutNode other = e.from;
+                        LayoutEdge curEdge = e;
+                        while (cur.vertex == null && cur.succs.size() != 0) {
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y));
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+                            if (cur.succs.size() == 0) {
+                                break;
+                            }
+                            assert cur.succs.size() == 1;
+                            curEdge = cur.succs.get(0);
+                            cur = curEdge.to;
+                        }
+
+
+                        p = new Point(cur.x + curEdge.relativeTo, cur.y + cur.yOffset);
+                        points.add(p);
+                        if (curEdge.to.inOffsets.containsKey(curEdge.relativeTo)) {
+                            points.add(new Point(p.x, p.y + curEdge.to.inOffsets.get(curEdge.relativeTo)));
+                        }
+
+
+                        if (cur.succs.size() == 0 && cur.vertex == null) {
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+
+                            if (splitEndPoints.containsKey(e.link)) {
+                                points.add(null);
+                                points.addAll(splitEndPoints.get(e.link));
+
+                                //checkPoints(points);
+                                if (reversedLinks.contains(e.link)) {
+                                    Collections.reverse(points);
+                                }
+                                assert !linkPositions.containsKey(e.link);
+                                linkPositions.put(e.link, points);
+                            } else {
+                                splitStartPoints.put(e.link, points);
+                            }
+                        } else {
+
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+                                }
+                            }
+                            if (reversedLinks.contains(e.link)) {
+                                Collections.reverse(points);
+                            }
+                            //checkPoints(points);
+                            assert !linkPositions.containsKey(e.link);
+                            linkPositions.put(e.link, points);
+                        }
+
+                        pointCount += points.size();
+                        e.link = null;
+                    }
+                }
+            }
+
+            int minX = Integer.MAX_VALUE;
+            int minY = Integer.MAX_VALUE;
+            for (Vertex v : vertexPositions.keySet()) {
+                Point p = vertexPositions.get(v);
+                minX = Math.min(minX, p.x);
+                minY = Math.min(minY, p.y);
+            }
+
+            for (Link l : linkPositions.keySet()) {
+                List<Point> points = linkPositions.get(l);
+                for (Point p : points) {
+                    if (p != null) {
+                        minX = Math.min(minX, p.x);
+                        minY = Math.min(minY, p.y);
+                    }
+                }
+
+            }
+
+            for (Vertex v : vertexPositions.keySet()) {
+                Point p = vertexPositions.get(v);
+                p.x -= minX;
+                p.y -= minY;
+                v.setPosition(p);
+            }
+
+            for (Link l : linkPositions.keySet()) {
+                List<Point> points = linkPositions.get(l);
+                for (Point p : points) {
+                    if (p != null) {
+                        p.x -= minX;
+                        p.y -= minY;
+                    }
+                }
+                l.setControlPoints(points);
+
+            }
+        }
+
+        @Override
+        protected void printStatistics() {
+            System.out.println("Number of nodes: " + nodes.size());
+            int edgeCount = 0;
+            for (LayoutNode n : nodes) {
+                edgeCount += n.succs.size();
+            }
+            System.out.println("Number of edges: " + edgeCount);
+            System.out.println("Number of points: " + pointCount);
+        }
+    }
+
+    private static class Segment {
+
+        public float d;
+        public int orderNumber = -1;
+        public ArrayList<LayoutNode> nodes = new ArrayList<LayoutNode>();
+        public HashSet<Segment> succs = new HashSet<Segment>();
+        public HashSet<Segment> preds = new HashSet<Segment>();
+        public Region region;
+    }
+    private static final Comparator<Segment> segmentComparator = new Comparator<Segment>() {
+
+        public int compare(Segment s1, Segment s2) {
+            return s1.orderNumber - s2.orderNumber;
+        }
+    };
+
+    private static class Region {
+
+        public float d;
+        public int minOrderNumber;
+        public SortedSet<Segment> segments = new TreeSet<Segment>(segmentComparator);
+        public HashSet<Region> succs = new HashSet<Region>(4);
+        public HashSet<Region> preds = new HashSet<Region>(4);
+    }
+    private static final Comparator<Region> regionComparator = new Comparator<Region>() {
+
+        public int compare(Region r1, Region r2) {
+            return r1.minOrderNumber - r2.minOrderNumber;
+        }
+    };
+    private static final Comparator<LayoutNode> nodePositionComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            return n1.pos - n2.pos;
+        }
+    };
+    private static final Comparator<LayoutNode> nodeProcessingDownComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            if (n1.vertex == null) {
+                return -1;
+            }
+            if (n2.vertex == null) {
+                return 1;
+            }
+            return n1.preds.size() - n2.preds.size();
+        }
+    };
+    private static final Comparator<LayoutNode> nodeProcessingUpComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            if (n1.vertex == null) {
+                return -1;
+            }
+            if (n2.vertex == null) {
+                return 1;
+            }
+            return n1.succs.size() - n2.succs.size();
+        }
+    };
+
+    private class AssignXCoordinates2 extends AlgorithmPart {
+
+        private ArrayList<Integer>[] space;
+        private ArrayList<LayoutNode>[] downProcessingOrder;
+        private ArrayList<LayoutNode>[] upProcessingOrder;
+
+        private void initialPositions() {
+            for (LayoutNode n : nodes) {
+                n.x = space[n.layer].get(n.pos);
+            }
+        }
+
+        protected void run() {
+
+            space = new ArrayList[layers.length];
+            downProcessingOrder = new ArrayList[layers.length];
+            upProcessingOrder = new ArrayList[layers.length];
+
+            for (int i = 0; i < layers.length; i++) {
+                space[i] = new ArrayList<Integer>();
+                downProcessingOrder[i] = new ArrayList<LayoutNode>();
+                upProcessingOrder[i] = new ArrayList<LayoutNode>();
+
+                int curX = 0;
+                for (LayoutNode n : layers[i]) {
+                    space[i].add(curX);
+                    curX += n.width + xOffset;
+                    downProcessingOrder[i].add(n);
+                    upProcessingOrder[i].add(n);
+                }
+
+                Collections.sort(downProcessingOrder[i], nodeProcessingDownComparator);
+                Collections.sort(upProcessingOrder[i], nodeProcessingUpComparator);
+            }
+
+            initialPositions();
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+                sweepDown();
+                sweepUp();
+            }
+
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+                doubleSweep();
+            }
+        }
+
+        private int calculateOptimalDown(LayoutNode n) {
+
+            List<Integer> values = new ArrayList<Integer>();
+            if (n.preds.size() == 0) {
+                return n.x;
+            }
+            for (LayoutEdge e : n.preds) {
+                int cur = e.from.x + e.relativeFrom - e.relativeTo;
+                values.add(cur);
+            }
+            return median(values);
+        }
+
+        private int calculateOptimalBoth(LayoutNode n) {
+
+            List<Integer> values = new ArrayList<Integer>();
+            if (n.preds.size() == 0 + n.succs.size()) {
+                return n.x;
+            }
+            for (LayoutEdge e : n.preds) {
+                int cur = e.from.x + e.relativeFrom - e.relativeTo;
+                values.add(cur);
+            }
+
+            for (LayoutEdge e : n.succs) {
+                int cur = e.to.x + e.relativeTo - e.relativeFrom;
+                values.add(cur);
+            }
+
+            return median(values);
+        }
+
+        private int calculateOptimalUp(LayoutNode n) {
+
+            //List<Integer> values = new ArrayList<Integer>();
+            int size = n.succs.size();
+            if (size == 0) {
+                return n.x;
+            } else {
+                int result = 0;
+                for (LayoutEdge e : n.succs) {
+                    int cur = e.to.x + e.relativeTo - e.relativeFrom;
+                    result += cur;
+                }
+                return result / size; //median(values);
+            }
+        }
+
+        private int median(List<Integer> values) {
+            Collections.sort(values);
+            if (values.size() % 2 == 0) {
+                return (values.get(values.size() / 2 - 1) + values.get(values.size() / 2)) / 2;
+            } else {
+                return values.get(values.size() / 2);
+            }
+        }
+
+        private void sweepUp() {
+            for (int i = layers.length - 1; i >= 0; i--) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : upProcessingOrder[i]) {
+                    int optimal = calculateOptimalUp(n);
+                    r.insert(n, optimal);
+                }
+            }
+        /*
+        for(int i=0; i<layers.length; i++) {
+        NodeRow r = new NodeRow(space[i]);
+        for(LayoutNode n : upProcessingOrder[i]) {
+        int optimal = calculateOptimalUp(n);
+        r.insert(n, optimal);
+        }
+        }*/
+        }
+
+        private void doubleSweep() {
+            for (int i = layers.length - 2; i >= 0; i--) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : upProcessingOrder[i]) {
+                    int optimal = calculateOptimalBoth(n);
+                    r.insert(n, optimal);
+                }
+            }
+        }
+
+        private void sweepDown() {
+            for (int i = 1; i < layers.length; i++) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : downProcessingOrder[i]) {
+                    int optimal = calculateOptimalDown(n);
+                    r.insert(n, optimal);
+                }
+            }
+        }
+    }
+
+    private static class NodeRow {
+
+        private TreeSet<LayoutNode> treeSet;
+        private ArrayList<Integer> space;
+
+        public NodeRow(ArrayList<Integer> space) {
+            treeSet = new TreeSet<LayoutNode>(nodePositionComparator);
+            this.space = space;
+        }
+
+        public int offset(LayoutNode n1, LayoutNode n2) {
+            int v1 = space.get(n1.pos) + n1.width;
+            int v2 = space.get(n2.pos);
+            return v2 - v1;
+        }
+
+        public void insert(LayoutNode n, int pos) {
+
+            SortedSet<LayoutNode> headSet = treeSet.headSet(n);
+
+            LayoutNode leftNeighbor = null;
+            int minX = Integer.MIN_VALUE;
+            if (!headSet.isEmpty()) {
+                leftNeighbor = headSet.last();
+                minX = leftNeighbor.x + leftNeighbor.width + offset(leftNeighbor, n);
+            }
+
+            if (pos < minX) {
+                n.x = minX;
+            } else {
+
+                LayoutNode rightNeighbor = null;
+                SortedSet<LayoutNode> tailSet = treeSet.tailSet(n);
+                int maxX = Integer.MAX_VALUE;
+                if (!tailSet.isEmpty()) {
+                    rightNeighbor = tailSet.first();
+                    maxX = rightNeighbor.x - offset(n, rightNeighbor) - n.width;
+                }
+
+                if (pos > maxX) {
+                    n.x = maxX;
+                } else {
+                    n.x = pos;
+                }
+
+                assert minX <= maxX;
+            }
+
+            treeSet.add(n);
+        }
+    }
+
+    private class AssignXCoordinates extends AlgorithmPart {
+
+        HashMap<LayoutNode, Segment> hashMap = new HashMap<LayoutNode, Segment>();
+        ArrayList<Segment> segments = new ArrayList<Segment>();
+
+        private void generateSegments() {
+
+            for (int i = 0; i < layerCount; i++) {
+                for (LayoutNode n : layers[i]) {
+                    if (!hashMap.containsKey(n)) {
+                        Segment s = new Segment();
+                        segments.add(s);
+                        LayoutNode curNode = n;
+
+                        int maxLength = 0;
+                        while (curNode.succs.size() == 1 && curNode.preds.size() == 1) {
+                            s.nodes.add(curNode);
+                            assert !hashMap.containsKey(curNode);
+                            hashMap.put(curNode, s);
+                            curNode = curNode.succs.get(0).to;
+                            maxLength++;
+                        //if(maxLength > 10) break;
+                        }
+
+                        if (s.nodes.size() > 0 && curNode.preds.size() == 1 && curNode.vertex == null) {
+                            s.nodes.add(curNode);
+                            assert !hashMap.containsKey(curNode);
+                            hashMap.put(curNode, s);
+                        }
+
+                        if (s.nodes.size() == 0) {
+                            // Simple segment with a single node
+                            s.nodes.add(n);
+                            hashMap.put(n, s);
+                        }
+                    }
+                }
+            }
+        }
+
+        private void addEdges() {
+
+            for (int i = 0; i < layerCount; i++) {
+                LayoutNode prev = null;
+                for (LayoutNode n : layers[i]) {
+
+                    if (prev != null) {
+                        Segment s1 = hashMap.get(prev);
+                        Segment s2 = hashMap.get(n);
+
+                        if (s1 != s2) {
+                            s1.succs.add(s2);
+                            s2.preds.add(s1);
+                        }
+                    }
+                    prev = n;
+
+                }
+            }
+        }
+
+        private void topologicalSorting() {
+
+            Queue<Segment> queue = new LinkedList<Segment>();
+
+            int index = 0;
+            ArrayList<Segment> newList = new ArrayList<Segment>();
+            for (Segment s : segments) {
+                if (s.preds.size() == 0) {
+                    s.orderNumber = index;
+                    newList.add(s);
+                    index++;
+                    queue.add(s);
+                }
+            }
+
+            while (!queue.isEmpty()) {
+                Segment s = queue.remove();
+
+                for (Segment succ : s.succs) {
+                    succ.preds.remove(s);
+                    if (succ.preds.size() == 0) {
+                        queue.add(succ);
+                        succ.orderNumber = index;
+                        newList.add(succ);
+                        index++;
+                    }
+                }
+            }
+
+            segments = newList;
+        }
+
+        private void initialPositions() {
+
+            int[] minPos = new int[layers.length];
+
+            for (Segment s : segments) {
+                int max = 0;
+                for (LayoutNode n : s.nodes) {
+                    int x = minPos[n.layer];
+                    if (x > max) {
+                        max = x;
+                    }
+                }
+
+                for (LayoutNode n : s.nodes) {
+                    minPos[n.layer] = max + n.width + xOffset;
+                    n.x = max;
+                }
+            }
+        }
+
+        private int predSum(LayoutNode n) {
+            int sum = 0;
+            for (LayoutEdge e : n.preds) {
+                assert e.to == n;
+                //sum += (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d) - (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d);
+                sum += (e.from.x + e.relativeFrom) - (e.to.x + e.relativeTo);
+            }
+
+            return sum;
+        }
+
+        private int succSum(LayoutNode n) {
+            int sum = 0;
+            for (LayoutEdge e : n.succs) {
+
+                assert e.from == n;
+                sum += (e.to.x + e.relativeTo) - (e.from.x + e.relativeFrom);
+            //sum += (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d) - (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d);
+            }
+
+            return sum;
+
+        }
+
+        private void downValues() {
+
+            for (Segment s : segments) {
+                downValues(s);
+
+            }
+
+        }
+
+        private void downValues(Segment s) {
+            LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+            if (n.preds.size() == 0) {
+                // Value is 0.0;
+                if (n.succs.size() == 0) {
+                    s.d = 0.0f;
+                } else {
+                    s.d = (((float) succSum(n) / (float) n.succs.size())) / 2;
+                }
+            } else {
+                s.d = (float) predSum(n) / (float) n.preds.size();
+            }
+        }
+
+        private void upValues() {
+            for (Segment s : segments) {
+                upValues(s);
+            }
+        }
+
+        private void upValues(Segment s) {
+            LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+            if (n.succs.size() == 0) {
+                // Value is 0.0;
+                if (n.preds.size() == 0) {
+                    s.d = 0.0f;
+                } else {
+                    s.d = (float) predSum(n) / (float) n.preds.size();
+                }
+            } else {
+                s.d = ((float) succSum(n) / (float) n.succs.size()) / 2;
+            }
+        }
+
+        private void sweep(boolean down) {
+
+            if (down) {
+                downValues();
+            } else {
+                upValues();
+            }
+
+            SortedSet<Region> regions = new TreeSet<Region>(regionComparator);
+            for (Segment s : segments) {
+                s.region = new Region();
+                s.region.minOrderNumber = s.orderNumber;
+                s.region.segments.add(s);
+                s.region.d = s.d;
+                regions.add(s.region);
+            }
+
+            for (Segment s : segments) {
+                for (LayoutNode n : s.nodes) {
+                    if (n.pos != 0) {
+                        LayoutNode prevNode = layers[n.layer].get(n.pos - 1);
+                        if (prevNode.x + prevNode.width + xOffset == n.x) {
+                            Segment other = hashMap.get(prevNode);
+                            Region r1 = s.region;
+                            Region r2 = other.region;
+                            // They are close together
+                            if (r1 != r2 && r2.d >= r1.d) {
+
+                                if (r2.segments.size() < r1.segments.size()) {
+
+                                    r1.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+                                    for (Segment tempS : r2.segments) {
+                                        r1.segments.add(tempS);
+                                        tempS.region = r1;
+                                        r1.minOrderNumber = Math.min(r1.minOrderNumber, tempS.orderNumber);
+                                    }
+
+                                    regions.remove(r2);
+                                } else {
+
+                                    r2.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+                                    for (Segment tempS : r1.segments) {
+                                        r2.segments.add(tempS);
+                                        tempS.region = r2;
+                                        r2.minOrderNumber = Math.min(r2.minOrderNumber, tempS.orderNumber);
+                                    }
+
+                                    regions.remove(r1);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+
+
+            ArrayList<Region> reversedRegions = new ArrayList<Region>();
+            for (Region r : regions) {
+                if (r.d < 0) {
+                    processRegion(r, down);
+                } else {
+                    reversedRegions.add(0, r);
+                }
+            }
+
+            for (Region r : reversedRegions) {
+                processRegion(r, down);
+            }
+
+        }
+
+        private void processRegion(Region r, boolean down) {
+
+            // Do not move
+            if ((int) r.d == 0) {
+                return;
+            }
+
+            ArrayList<Segment> arr = new ArrayList<Segment>();
+            for (Segment s : r.segments) {
+                arr.add(s);
+            }
+
+            if (r.d > 0) {
+                Collections.reverse(arr);
+            }
+
+            for (Segment s : arr) {
+
+
+                int min = (int) r.d;
+                if (min < 0) {
+                    min = -min;
+                }
+
+                for (LayoutNode n : s.nodes) {
+
+                    int layer = n.layer;
+                    int pos = n.pos;
+
+
+                    if (r.d > 0) {
+
+                        if (pos != layers[layer].size() - 1) {
+
+                            int off = layers[layer].get(pos + 1).x - n.x - xOffset - n.width;
+                            assert off >= 0;
+                            if (off < min) {
+                                min = off;
+                            }
+                        }
+
+                    } else {
+
+                        if (pos != 0) {
+
+                            int off = n.x - xOffset - layers[layer].get(pos - 1).x - layers[layer].get(pos - 1).width;
+                            assert off >= 0;
+                            if (off < min) {
+                                min = off;
+                            }
+                        }
+                    }
+                }
+
+                assert min >= 0;
+                if (min != 0) {
+                    for (LayoutNode n : s.nodes) {
+                        if (r.d > 0) {
+                            n.x += min;
+                        } else {
+                            n.x -= min;
+                        }
+
+                    }
+                }
+            }
+        }
+
+        protected void run() {
+
+            generateSegments();
+            addEdges();
+            topologicalSorting();
+            initialPositions();
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+
+                sweep(true);
+                sweep(true);
+                sweep(false);
+                sweep(false);
+            }
+
+            sweep(true);
+            sweep(true);
+        }
+    }
+    private static Comparator<LayoutNode> crossingNodeComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            return n1.crossingNumber - n2.crossingNumber;
+        }
+    };
+
+    private class CrossingReduction extends AlgorithmPart {
+
+        @Override
+        public void preCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer < layerCount;
+            }
+        }
+
+        protected void run() {
+
+            layers = new List[layerCount];
+
+            for (int i = 0; i < layerCount; i++) {
+                layers[i] = new ArrayList<LayoutNode>();
+            }
+
+
+            // Generate initial ordering
+            HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+            for (LayoutNode n : nodes) {
+                if (n.layer == 0) {
+                    layers[0].add(n);
+                    visited.add(n);
+                } else if (n.preds.size() == 0) {
+                    layers[n.layer].add(n);
+                    visited.add(n);
+                }
+            }
+
+            for (int i = 0; i < layers.length - 1; i++) {
+                for (LayoutNode n : layers[i]) {
+                    for (LayoutEdge e : n.succs) {
+                        if (!visited.contains(e.to)) {
+                            visited.add(e.to);
+                            layers[i + 1].add(e.to);
+                        }
+                    }
+                }
+            }
+
+
+            updatePositions();
+
+            initX();
+
+            // Optimize
+            for (int i = 0; i < CROSSING_ITERATIONS; i++) {
+                downSweep();
+                upSweep();
+            }
+
+        /*for(int i=0; i<CROSSING_ITERATIONS; i++) {
+        doubleSweep();
+        }*/
+        }
+
+        private void initX() {
+
+            for (int i = 0; i < layers.length; i++) {
+                updateXOfLayer(i);
+            }
+        }
+
+        private void updateXOfLayer(int index) {
+            int x = 0;
+
+            for (LayoutNode n : layers[index]) {
+                n.x = x;
+                x += n.width + X_OFFSET;
+            }
+        }
+
+        private void updatePositions() {
+
+            for (int i = 0; i < layers.length; i++) {
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private void downSweep() {
+
+            // Downsweep
+            for (int i = 1; i < layerCount; i++) {
+
+                for (LayoutNode n : layers[i]) {
+                    n.crossingNumber = 0;
+                }
+
+                for (LayoutNode n : layers[i]) {
+
+                    int sum = 0;
+                    for (LayoutEdge e : n.preds) {
+                        int cur = e.from.x + e.relativeFrom;
+
+                        /*pos;
+                        if(e.from.width != 0 && e.relativeFrom != 0) {
+                        cur += (float)e.relativeFrom / (float)(e.from.width);
+                        }*/
+
+                        sum += cur;
+                    }
+
+                    if (n.preds.size() > 0) {
+                        sum /= n.preds.size();
+                        n.crossingNumber = sum;
+                    //if(n.vertex == null) n.crossingNumber += layers[i].size();
+                    }
+                }
+
+
+                updateCrossingNumbers(i, true);
+                Collections.sort(layers[i], crossingNodeComparator);
+                updateXOfLayer(i);
+
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private void updateCrossingNumbers(int index, boolean down) {
+            for (int i = 0; i < layers[index].size(); i++) {
+                LayoutNode n = layers[index].get(i);
+                LayoutNode prev = null;
+                if (i > 0) {
+                    prev = layers[index].get(i - 1);
+                }
+                LayoutNode next = null;
+                if (i < layers[index].size() - 1) {
+                    next = layers[index].get(i + 1);
+                }
+
+                boolean cond = (n.succs.size() == 0);
+                if (down) {
+                    cond = (n.preds.size() == 0);
+                }
+
+                if (cond) {
+
+                    if (prev != null && next != null) {
+                        n.crossingNumber = (prev.crossingNumber + next.crossingNumber) / 2;
+                    } else if (prev != null) {
+                        n.crossingNumber = prev.crossingNumber;
+                    } else if (next != null) {
+                        n.crossingNumber = next.crossingNumber;
+                    }
+                }
+            }
+        }
+        /*
+        private void doubleSweep() {
+        // Downsweep
+        for(int i=0; i<layerCount*2; i++) {
+        int index = i;
+        if(index >= layerCount) {
+        index = 2*layerCount - i - 1;
+        }
+        for(LayoutNode n : layers[index]) {
+        float sum = 0.0f;
+        for(LayoutEdge e : n.preds) {
+        float cur = e.from.pos;
+        if(e.from.width != 0 && e.relativeFrom != 0) {
+        cur += (float)e.relativeFrom / (float)(e.from.width);
+        }
+        sum += cur;
+        }
+        for(LayoutEdge e : n.succs) {
+        float cur = e.to.pos;
+        if(e.to.width != 0 && e.relativeTo != 0) {
+        cur += (float)e.relativeTo / (float)(e.to.width);
+        }
+        sum += cur;
+        }
+        if(n.preds.size() + n.succs.size() > 0) {
+        sum /= n.preds.size() + n.succs.size();
+        n.crossingNumber = sum;
+        }
+        }
+        Collections.sort(layers[index], crossingNodeComparator);
+        updateXOfLayer(index);
+        int z = 0;
+        for(LayoutNode n : layers[index]) {
+        n.pos = z;
+        z++;
+        }
+        }
+        }*/
+
+        private void upSweep() {
+            // Upsweep
+            for (int i = layerCount - 2; i >= 0; i--) {
+
+                for (LayoutNode n : layers[i]) {
+                    n.crossingNumber = 0;
+                }
+
+                for (LayoutNode n : layers[i]) {
+
+                    int sum = 0;
+                    for (LayoutEdge e : n.succs) {
+                        int cur = e.to.x + e.relativeTo;//pos;
+                                                /*
+                        if(e.to.width != 0 && e.relativeTo != 0) {
+                        cur += (float)e.relativeTo / (float)(e.to.width);
+                        }*/
+
+                        sum += cur;
+                    }
+
+                    if (n.succs.size() > 0) {
+                        sum /= n.succs.size();
+                        n.crossingNumber = sum;
+                    //if(n.vertex == null) n.crossingNumber += layers[i].size();
+                    }
+
+                }
+
+                updateCrossingNumbers(i, false);
+                Collections.sort(layers[i], crossingNodeComparator);
+                updateXOfLayer(i);
+
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private int evaluate() {
+            // TODO: Implement efficient evaluate / crossing min
+            return 0;
+        }
+
+        @Override
+        public void postCheck() {
+
+            HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+            for (int i = 0; i < layers.length; i++) {
+                for (LayoutNode n : layers[i]) {
+                    assert !visited.contains(n);
+                    assert n.layer == i;
+                    visited.add(n);
+                }
+            }
+
+        }
+    }
+
+    private class AssignYCoordinates extends AlgorithmPart {
+
+        protected void run() {
+            int curY = 0;
+            //maxLayerHeight = new int[layers.length];
+            for (int i = 0; i < layers.length; i++) {
+                int maxHeight = 0;
+                int baseLine = 0;
+                int bottomBaseLine = 0;
+                for (LayoutNode n : layers[i]) {
+                    maxHeight = Math.max(maxHeight, n.height - n.yOffset - n.bottomYOffset);
+                    baseLine = Math.max(baseLine, n.yOffset);
+                    bottomBaseLine = Math.max(bottomBaseLine, n.bottomYOffset);
+                }
+
+                int maxXOffset = 0;
+                for (LayoutNode n : layers[i]) {
+                    if (n.vertex == null) {
+                        // Dummy node
+                        n.y = curY;
+                        n.height = maxHeight + baseLine + bottomBaseLine;
+
+                    } else {
+                        n.y = curY + baseLine + (maxHeight - (n.height - n.yOffset - n.bottomYOffset)) / 2 - n.yOffset;
+                    }
+
+                    for (LayoutEdge e : n.succs) {
+                        int curXOffset = Math.abs(n.x - e.to.x);
+                        maxXOffset = Math.max(curXOffset, maxXOffset);
+                    }
+                }
+
+                //maxLayerHeight[i] = maxHeight + baseLine + bottomBaseLine;
+
+                curY += maxHeight + baseLine + bottomBaseLine;
+                curY += layerOffset + (int) Math.sqrt(maxXOffset);
+            }
+        }
+    }
+
+    private class CreateDummyNodes extends AlgorithmPart {
+
+        private int oldNodeCount;
+
+        @Override
+        protected void preCheck() {
+            for (LayoutNode n : nodes) {
+                for (LayoutEdge e : n.succs) {
+                    assert e.from != null;
+                    assert e.from == n;
+                    assert e.from.layer < e.to.layer;
+                }
+
+                for (LayoutEdge e : n.preds) {
+                    assert e.to != null;
+                    assert e.to == n;
+                }
+            }
+        }
+
+        protected void run() {
+            oldNodeCount = nodes.size();
+
+
+            if (combine == Combine.SAME_OUTPUTS) {
+
+                Comparator<LayoutEdge> comparator = new Comparator<LayoutEdge>() {
+
+                    public int compare(LayoutEdge e1, LayoutEdge e2) {
+                        return e1.to.layer - e2.to.layer;
+                    }
+                };
+                HashMap<Integer, List<LayoutEdge>> portHash = new HashMap<Integer, List<LayoutEdge>>();
+                ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+                for (LayoutNode n : currentNodes) {
+                    portHash.clear();
+
+                    ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(n.succs);
+                    HashMap<Integer, LayoutNode> topNodeHash = new HashMap<Integer, LayoutNode>();
+                    HashMap<Integer, HashMap<Integer, LayoutNode>> bottomNodeHash = new HashMap<Integer, HashMap<Integer, LayoutNode>>();
+                    for (LayoutEdge e : succs) {
+                        assert e.from.layer < e.to.layer;
+                        if (e.from.layer != e.to.layer - 1) {
+                            if (maxLayerLength != -1 && e.to.layer - e.from.layer > maxLayerLength/* && e.to.preds.size() > 1 && e.from.succs.size() > 1*/) {
+                                assert maxLayerLength > 2;
+                                e.to.preds.remove(e);
+                                e.from.succs.remove(e);
+
+                                LayoutEdge topEdge = null;
+
+                                if (combine == Combine.SAME_OUTPUTS && topNodeHash.containsKey(e.relativeFrom)) {
+                                    LayoutNode topNode = topNodeHash.get(e.relativeFrom);
+                                    topEdge = new LayoutEdge();
+                                    topEdge.relativeFrom = e.relativeFrom;
+                                    topEdge.from = e.from;
+                                    topEdge.relativeTo = topNode.width / 2;
+                                    topEdge.to = topNode;
+                                    topEdge.link = e.link;
+                                    e.from.succs.add(topEdge);
+                                    topNode.preds.add(topEdge);
+                                } else {
+
+                                    LayoutNode topNode = new LayoutNode();
+                                    topNode.layer = e.from.layer + 1;
+                                    topNode.width = DUMMY_WIDTH;
+                                    topNode.height = DUMMY_HEIGHT;
+                                    nodes.add(topNode);
+                                    topEdge = new LayoutEdge();
+                                    topEdge.relativeFrom = e.relativeFrom;
+                                    topEdge.from = e.from;
+                                    topEdge.relativeTo = topNode.width / 2;
+                                    topEdge.to = topNode;
+                                    topEdge.link = e.link;
+                                    e.from.succs.add(topEdge);
+                                    topNode.preds.add(topEdge);
+                                    topNodeHash.put(e.relativeFrom, topNode);
+                                    bottomNodeHash.put(e.relativeFrom, new HashMap<Integer, LayoutNode>());
+                                }
+
+                                HashMap<Integer, LayoutNode> hash = bottomNodeHash.get(e.relativeFrom);
+
+                                LayoutNode bottomNode = null;
+                                if (hash.containsKey(e.to.layer)) {
+                                    bottomNode = hash.get(e.to.layer);
+                                } else {
+
+                                    bottomNode = new LayoutNode();
+                                    bottomNode.layer = e.to.layer - 1;
+                                    bottomNode.width = DUMMY_WIDTH;
+                                    bottomNode.height = DUMMY_HEIGHT;
+                                    nodes.add(bottomNode);
+                                    hash.put(e.to.layer, bottomNode);
+                                }
+
+                                LayoutEdge bottomEdge = new LayoutEdge();
+                                bottomEdge.relativeTo = e.relativeTo;
+                                bottomEdge.to = e.to;
+                                bottomEdge.relativeFrom = bottomNode.width / 2;
+                                bottomEdge.from = bottomNode;
+                                bottomEdge.link = e.link;
+                                e.to.preds.add(bottomEdge);
+                                bottomEdgeHash.put(topEdge, bottomEdge);
+                                bottomNode.succs.add(bottomEdge);
+
+                            } else {
+                                Integer i = e.relativeFrom;
+                                if (!portHash.containsKey(i)) {
+                                    portHash.put(i, new ArrayList<LayoutEdge>());
+                                }
+
+                                if (n.vertex.toString().equals("1012 CastPP")) {
+                                    int x = 0;
+                                }
+
+                                portHash.get(i).add(e);
+                            }
+                        }
+                    }
+
+                    succs = new ArrayList<LayoutEdge>(n.succs);
+                    for (LayoutEdge e : succs) {
+
+                        Integer i = e.relativeFrom;
+                        if (portHash.containsKey(i)) {
+
+                            List<LayoutEdge> list = portHash.get(i);
+                            Collections.sort(list, comparator);
+
+                            if (list.size() == 1) {
+                                processSingleEdge(list.get(0));
+                            } else {
+
+                                int maxLayer = list.get(0).to.layer;
+                                for (LayoutEdge curEdge : list) {
+                                    maxLayer = Math.max(maxLayer, curEdge.to.layer);
+                                }
+
+
+                                int cnt = maxLayer - n.layer - 1;
+                                LayoutEdge[] edges = new LayoutEdge[cnt];
+                                LayoutNode[] nodes = new LayoutNode[cnt];
+                                edges[0] = new LayoutEdge();
+                                edges[0].from = n;
+                                edges[0].relativeFrom = i;
+                                n.succs.add(edges[0]);
+
+                                nodes[0] = new LayoutNode();
+                                nodes[0].width = dummyWidth;
+                                nodes[0].height = dummyHeight;
+                                nodes[0].layer = n.layer + 1;
+                                nodes[0].preds.add(edges[0]);
+                                edges[0].to = nodes[0];
+                                edges[0].relativeTo = nodes[0].width / 2;
+                                for (int j = 1; j < cnt; j++) {
+                                    edges[j] = new LayoutEdge();
+                                    edges[j].from = nodes[j - 1];
+                                    edges[j].relativeFrom = nodes[j - 1].width / 2;
+                                    nodes[j - 1].succs.add(edges[j]);
+                                    nodes[j] = new LayoutNode();
+                                    nodes[j].width = dummyWidth;
+                                    nodes[j].height = dummyHeight;
+                                    nodes[j].layer = n.layer + j + 1;
+                                    nodes[j].preds.add(edges[j]);
+                                    edges[j].to = nodes[j];
+                                    edges[j].relativeTo = nodes[j].width / 2;
+                                }
+
+                                for (LayoutEdge curEdge : list) {
+                                    assert curEdge.to.layer - n.layer - 2 >= 0;
+                                    assert curEdge.to.layer - n.layer - 2 < cnt;
+                                    LayoutNode anchor = nodes[curEdge.to.layer - n.layer - 2];
+                                    anchor.succs.add(curEdge);
+                                    curEdge.from = anchor;
+                                    curEdge.relativeFrom = anchor.width / 2;
+                                    n.succs.remove(curEdge);
+                                }
+
+                            }
+
+                            portHash.remove(i);
+                        }
+                    }
+                }
+            } else if (combine == Combine.SAME_INPUTS) {
+                throw new UnsupportedOperationException("Currently not supported");
+            } else {
+                ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+                for (LayoutNode n : currentNodes) {
+                    for (LayoutEdge e : n.succs) {
+                        processSingleEdge(e);
+                    }
+                }
+            }
+        }
+
+        private void processSingleEdge(LayoutEdge e) {
+            LayoutNode n = e.from;
+            if (e.to.layer > n.layer + 1) {
+                LayoutEdge last = e;
+                for (int i = n.layer + 1; i < last.to.layer; i++) {
+                    last = addBetween(last, i);
+                }
+            }
+        }
+
+        private LayoutEdge addBetween(LayoutEdge e, int layer) {
+            LayoutNode n = new LayoutNode();
+            n.width = dummyWidth;
+            n.height = dummyHeight;
+            n.layer = layer;
+            n.preds.add(e);
+            nodes.add(n);
+            LayoutEdge result = new LayoutEdge();
+            n.succs.add(result);
+            result.from = n;
+            result.relativeFrom = n.width / 2;
+            result.to = e.to;
+            result.relativeTo = e.relativeTo;
+            e.relativeTo = n.width / 2;
+            e.to.preds.remove(e);
+            e.to.preds.add(result);
+            e.to = n;
+            return result;
+        }
+
+        @Override
+        public void printStatistics() {
+            System.out.println("Dummy nodes created: " + (nodes.size() - oldNodeCount));
+        }
+
+        @Override
+        public void postCheck() {
+            ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+            for (LayoutNode n : currentNodes) {
+                for (LayoutEdge e : n.succs) {
+                    assert e.from.layer == e.to.layer - 1;
+                }
+            }
+
+            for (int i = 0; i < layers.length; i++) {
+                assert layers[i].size() > 0;
+                for (LayoutNode n : layers[i]) {
+                    assert n.layer == i;
+                }
+            }
+        }
+    }
+
+    private class AssignLayers extends AlgorithmPart {
+
+        @Override
+        public void preCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer == -1;
+            }
+        }
+
+        protected void run() {
+            HashSet<LayoutNode> set = new HashSet<LayoutNode>();
+            for (LayoutNode n : nodes) {
+                if (n.preds.size() == 0) {
+                    set.add(n);
+                    n.layer = 0;
+                }
+            }
+
+            int z = minLayerDifference;
+            HashSet<LayoutNode> newSet = new HashSet<LayoutNode>();
+            HashSet<LayoutNode> failed = new HashSet<LayoutNode>();
+            while (!set.isEmpty()) {
+
+                newSet.clear();
+                failed.clear();
+
+                for (LayoutNode n : set) {
+
+                    for (LayoutEdge se : n.succs) {
+                        LayoutNode s = se.to;
+                        if (!newSet.contains(s) && !failed.contains(s)) {
+                            boolean ok = true;
+                            for (LayoutEdge pe : s.preds) {
+                                LayoutNode p = pe.from;
+                                if (p.layer == -1) {
+                                    ok = false;
+                                    break;
+                                }
+                            }
+
+                            if (ok) {
+                                newSet.add(s);
+                            } else {
+                                failed.add(s);
+                            }
+                        }
+                    }
+
+                }
+
+                for (LayoutNode n : newSet) {
+                    n.layer = z;
+                }
+
+                // Swap sets
+                HashSet<LayoutNode> tmp = set;
+                set = newSet;
+                newSet = tmp;
+                z += minLayerDifference;
+            }
+
+            optimize(set);
+
+            layerCount = z - minLayerDifference;
+
+            for (Vertex v : lastLayerHint) {
+
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert n.succs.size() == 0;
+                n.layer = layerCount - 1;
+            }
+
+            for (Vertex v : firstLayerHint) {
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert n.preds.size() == 0;
+                assert n.layer == 0;
+            }
+        }
+
+        public void optimize(HashSet<LayoutNode> set) {
+
+            for (LayoutNode n : set) {
+                if (n.preds.size() == 0 && n.succs.size() > 0) {
+                    int minLayer = n.succs.get(0).to.layer;
+                    for (LayoutEdge e : n.succs) {
+                        minLayer = Math.min(minLayer, e.to.layer);
+                    }
+
+                    n.layer = minLayer - 1;
+                }
+            }
+
+        }
+
+        @Override
+        public void postCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer >= 0;
+                assert n.layer < layerCount;
+                for (LayoutEdge e : n.succs) {
+                    assert e.from.layer < e.to.layer;
+                }
+            }
+        }
+    }
+
+    private class ReverseEdges extends AlgorithmPart {
+
+        private HashSet<LayoutNode> visited;
+        private HashSet<LayoutNode> active;
+
+        protected void run() {
+
+            // Remove self-edges, TODO: Special treatment
+            for (LayoutNode node : nodes) {
+                ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+                for (LayoutEdge e : succs) {
+                    assert e.from == node;
+                    if (e.to == node) {
+                        node.succs.remove(e);
+                        node.preds.remove(e);
+                    }
+                }
+            }
+
+            // Reverse inputs of roots
+            for (LayoutNode node : nodes) {
+                if (node.vertex.isRoot()) {
+                    boolean ok = true;
+                    for (LayoutEdge e : node.preds) {
+                        if (e.from.vertex.isRoot()) {
+                            ok = false;
+                            break;
+                        }
+                    }
+                    if (ok) {
+                        reverseAllInputs(node);
+                    }
+                }
+            }
+
+
+            // Start DFS and reverse back edges
+            visited = new HashSet<LayoutNode>();
+            active = new HashSet<LayoutNode>();
+            for (LayoutNode node : nodes) {
+                DFS(node);
+            }
+
+
+            for (LayoutNode node : nodes) {
+
+                SortedSet<Integer> reversedDown = new TreeSet<Integer>();
+
+                for (LayoutEdge e : node.succs) {
+                    if (reversedLinks.contains(e.link)) {
+                        reversedDown.add(e.relativeFrom);
+                    }
+                }
+
+
+                SortedSet<Integer> reversedUp = null;
+                if (reversedDown.size() == 0) {
+                    reversedUp = new TreeSet<Integer>(Collections.reverseOrder());
+                } else {
+                    reversedUp = new TreeSet<Integer>();
+                }
+
+                for (LayoutEdge e : node.preds) {
+                    if (reversedLinks.contains(e.link)) {
+                        reversedUp.add(e.relativeTo);
+                    }
+                }
+
+                final int offset = X_OFFSET + DUMMY_WIDTH;
+
+                int curX = 0;
+                int curWidth = node.width + reversedDown.size() * offset;
+                for (int pos : reversedDown) {
+                    ArrayList<LayoutEdge> reversedSuccs = new ArrayList<LayoutEdge>();
+                    for (LayoutEdge e : node.succs) {
+                        if (e.relativeFrom == pos && reversedLinks.contains(e.link)) {
+                            reversedSuccs.add(e);
+                            e.relativeFrom = curWidth;
+                        }
+                    }
+
+                    ArrayList<Point> startPoints = new ArrayList<Point>();
+                    startPoints.add(new Point(curWidth, curX));
+                    startPoints.add(new Point(pos, curX));
+                    startPoints.add(new Point(pos, reversedDown.size() * offset));
+                    for (LayoutEdge e : reversedSuccs) {
+                        reversedLinkStartPoints.put(e.link, startPoints);
+                    }
+
+                    node.inOffsets.put(pos, -curX);
+                    curX += offset;
+                    node.height += offset;
+                    node.yOffset += offset;
+                    curWidth -= offset;
+                }
+                node.width += reversedDown.size() * offset;
+
+                if (reversedDown.size() == 0) {
+                    curX = offset;
+                } else {
+                    curX = -offset;
+                }
+
+                curX = 0;
+                int minX = 0;
+                if (reversedDown.size() != 0) {
+                    minX = -offset * reversedUp.size();
+                }
+
+                int oldNodeHeight = node.height;
+                for (int pos : reversedUp) {
+                    ArrayList<LayoutEdge> reversedPreds = new ArrayList<LayoutEdge>();
+                    for (LayoutEdge e : node.preds) {
+                        if (e.relativeTo == pos && reversedLinks.contains(e.link)) {
+                            if (reversedDown.size() == 0) {
+                                e.relativeTo = node.width + offset;
+                            } else {
+                                e.relativeTo = curX - offset;
+                            }
+
+                            reversedPreds.add(e);
+                        }
+                    }
+                    node.height += offset;
+                    ArrayList<Point> endPoints = new ArrayList<Point>();
+
+                    if (reversedDown.size() == 0) {
+
+                        curX += offset;
+                        node.width += offset;
+                        endPoints.add(new Point(node.width, node.height));
+
+                    } else {
+                        curX -= offset;
+                        node.width += offset;
+                        endPoints.add(new Point(curX, node.height));
+                    }
+
+                    node.outOffsets.put(pos - minX, curX);
+                    curX += offset;
+                    node.bottomYOffset += offset;
+
+
+                    endPoints.add(new Point(pos, node.height));
+                    endPoints.add(new Point(pos, oldNodeHeight));
+                    for (LayoutEdge e : reversedPreds) {
+                        reversedLinkEndPoints.put(e.link, endPoints);
+                    }
+                }
+
+
+                if (minX < 0) {
+                    for (LayoutEdge e : node.preds) {
+                        e.relativeTo -= minX;
+                    }
+
+                    for (LayoutEdge e : node.succs) {
+                        e.relativeFrom -= minX;
+                    }
+
+                    node.xOffset = -minX;
+                    node.width += -minX;
+                }
+            }
+
+        }
+
+        private void DFS(LayoutNode startNode) {
+            if (visited.contains(startNode)) {
+                return;
+            }
+
+            Stack<LayoutNode> stack = new Stack<LayoutNode>();
+            stack.push(startNode);
+
+            while (!stack.empty()) {
+                LayoutNode node = stack.pop();
+
+                if (visited.contains(node)) {
+                    // Node no longer active
+                    active.remove(node);
+                    continue;
+                }
+
+                // Repush immediately to know when no longer active
+                stack.push(node);
+                visited.add(node);
+                active.add(node);
+
+                ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+                for (LayoutEdge e : succs) {
+                    if (active.contains(e.to)) {
+                        assert visited.contains(e.to);
+                        // Encountered back edge
+                        reverseEdge(e);
+                    } else if (!visited.contains(e.to) && (linksToFollow.size() == 0 || linksToFollow.contains(e.link))) {
+                        stack.push(e.to);
+                    }
+                }
+            }
+        }
+
+        private void reverseAllInputs(LayoutNode node) {
+            for (LayoutEdge e : node.preds) {
+                assert !reversedLinks.contains(e.link);
+                reversedLinks.add(e.link);
+                node.succs.add(e);
+                e.from.preds.add(e);
+                e.from.succs.remove(e);
+                int oldRelativeFrom = e.relativeFrom;
+                int oldRelativeTo = e.relativeTo;
+                e.to = e.from;
+                e.from = node;
+                e.relativeFrom = oldRelativeTo;
+                e.relativeTo = oldRelativeFrom;
+            }
+            node.preds.clear();
+        }
+
+        private void reverseEdge(LayoutEdge e) {
+            assert !reversedLinks.contains(e.link);
+            reversedLinks.add(e.link);
+
+            LayoutNode oldFrom = e.from;
+            LayoutNode oldTo = e.to;
+            int oldRelativeFrom = e.relativeFrom;
+            int oldRelativeTo = e.relativeTo;
+
+            e.from = oldTo;
+            e.to = oldFrom;
+            e.relativeFrom = oldRelativeTo;
+            e.relativeTo = oldRelativeFrom;
+
+            oldFrom.succs.remove(e);
+            oldFrom.preds.add(e);
+            oldTo.preds.remove(e);
+            oldTo.succs.add(e);
+        }
+
+        @Override
+        public void postCheck() {
+
+            for (LayoutNode n : nodes) {
+
+                HashSet<LayoutNode> curVisited = new HashSet<LayoutNode>();
+                Queue<LayoutNode> queue = new LinkedList<LayoutNode>();
+                for (LayoutEdge e : n.succs) {
+                    LayoutNode s = e.to;
+                    queue.add(s);
+                    curVisited.add(s);
+                }
+
+                while (!queue.isEmpty()) {
+                    LayoutNode curNode = queue.remove();
+
+                    for (LayoutEdge e : curNode.succs) {
+                        assert e.to != n;
+                        if (!curVisited.contains(e.to)) {
+                            queue.add(e.to);
+                            curVisited.add(e.to);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    private Comparator<Link> linkComparator = new Comparator<Link>() {
+
+        public int compare(Link l1, Link l2) {
+
+            int result = l1.getFrom().getVertex().compareTo(l2.getFrom().getVertex());
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getTo().getVertex().compareTo(l2.getTo().getVertex());
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getFrom().getRelativePosition().x - l2.getFrom().getRelativePosition().x;
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getTo().getRelativePosition().x - l2.getTo().getRelativePosition().x;
+            return result;
+        }
+    };
+
+    private class BuildDatastructure extends AlgorithmPart {
+
+        protected void run() {
+            // Set up nodes
+            List<Vertex> vertices = new ArrayList<Vertex>(graph.getVertices());
+            Collections.sort(vertices);
+
+            for (Vertex v : vertices) {
+                LayoutNode node = new LayoutNode();
+                Dimension size = v.getSize();
+                node.width = (int) size.getWidth();
+                node.height = (int) size.getHeight();
+                node.vertex = v;
+                nodes.add(node);
+                vertexToLayoutNode.put(v, node);
+            }
+
+            // Set up edges
+            List<Link> links = new ArrayList<Link>(graph.getLinks());
+            Collections.sort(links, linkComparator);
+            for (Link l : links) {
+                LayoutEdge edge = new LayoutEdge();
+                assert vertexToLayoutNode.containsKey(l.getFrom().getVertex());
+                assert vertexToLayoutNode.containsKey(l.getTo().getVertex());
+                edge.from = vertexToLayoutNode.get(l.getFrom().getVertex());
+                edge.to = vertexToLayoutNode.get(l.getTo().getVertex());
+                edge.relativeFrom = l.getFrom().getRelativePosition().x;
+                edge.relativeTo = l.getTo().getRelativePosition().x;
+                edge.link = l;
+                edge.from.succs.add(edge);
+                edge.to.preds.add(edge);
+            //assert edge.from != edge.to; // No self-loops allowed
+            }
+
+            for (Link l : importantLinks) {
+                if (!vertexToLayoutNode.containsKey(l.getFrom().getVertex()) ||
+                        vertexToLayoutNode.containsKey(l.getTo().getVertex())) {
+                    continue;
+                }
+                LayoutNode from = vertexToLayoutNode.get(l.getFrom().getVertex());
+                LayoutNode to = vertexToLayoutNode.get(l.getTo().getVertex());
+                for (LayoutEdge e : from.succs) {
+                    if (e.to == to) {
+                        linksToFollow.add(e.link);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void postCheck() {
+
+            assert vertexToLayoutNode.keySet().size() == nodes.size();
+            assert nodes.size() == graph.getVertices().size();
+
+            for (Vertex v : graph.getVertices()) {
+
+                LayoutNode node = vertexToLayoutNode.get(v);
+                assert node != null;
+
+                for (LayoutEdge e : node.succs) {
+                    assert e.from == node;
+                }
+
+                for (LayoutEdge e : node.preds) {
+                    assert e.to == node;
+                }
+
+            }
+        }
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    // Do nothing for now
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java
new file mode 100644
index 0000000..ef423ed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InterClusterConnection implements Link {
+
+    private Port inputSlot;
+    private Port outputSlot;
+    private List<Point> intermediatePoints;
+    private ClusterInputSlotNode inputSlotNode;
+    private ClusterOutputSlotNode outputSlotNode;
+
+    public InterClusterConnection(ClusterOutputSlotNode outputSlotNode, ClusterInputSlotNode inputSlotNode) {
+        this.outputSlotNode = outputSlotNode;
+        this.inputSlotNode = inputSlotNode;
+        this.inputSlot = inputSlotNode.getInputSlot();
+        this.outputSlot = outputSlotNode.getOutputSlot();
+        intermediatePoints = new ArrayList<Point>();
+    }
+
+    public ClusterOutputSlotNode getOutputSlotNode() {
+        return outputSlotNode;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.intermediatePoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return intermediatePoints;
+    }
+
+    @Override
+    public String toString() {
+        return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java
new file mode 100644
index 0000000..3d43e91
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Node<N, E> {
+
+    private N data;
+    private List<Edge<N, E>> inEdges;
+    private List<Edge<N, E>> outEdges;
+    private boolean visited;
+    private boolean active;
+    private boolean reachable;
+    private Graph<N, E> graph;
+
+    protected boolean isVisited() {
+        return visited;
+    }
+
+    protected void setVisited(boolean b) {
+        visited = b;
+    }
+
+    protected boolean isReachable() {
+        return reachable;
+    }
+
+    protected void setReachable(boolean b) {
+        reachable = b;
+    }
+
+    protected boolean isActive() {
+        return active;
+    }
+
+    protected void setActive(boolean b) {
+        active = b;
+    }
+
+    public int getInDegree() {
+        return getInDegree(true);
+    }
+
+    public int getInDegree(boolean countSelfLoops) {
+        if (countSelfLoops) {
+            return inEdges.size();
+        } else {
+            int cnt = 0;
+            for (Edge<N, E> e : inEdges) {
+                if (e.getSource() != this) {
+                    cnt++;
+                }
+            }
+            return cnt;
+        }
+    }
+
+    public int getOutDegree() {
+        return outEdges.size();
+    }
+
+    protected Node(Graph<N, E> graph, N data) {
+        setData(data);
+        this.graph = graph;
+        inEdges = new ArrayList<Edge<N, E>>();
+        outEdges = new ArrayList<Edge<N, E>>();
+    }
+
+    protected void addInEdge(Edge<N, E> e) {
+        inEdges.add(e);
+    }
+
+    public Graph<N, E> getGraph() {
+        return graph;
+    }
+
+    protected void addOutEdge(Edge<N, E> e) {
+        outEdges.add(e);
+    }
+
+    protected void removeInEdge(Edge<N, E> e) {
+        //assert inEdges.contains(e);
+        inEdges.remove(e);
+    }
+
+    protected void removeOutEdge(Edge<N, E> e) {
+        //assert outEdges.contains(e);
+        outEdges.remove(e);
+    }
+
+    public List<Edge<N, E>> getInEdges() {
+        return Collections.unmodifiableList(inEdges);
+    }
+
+    public List<Edge<N, E>> getOutEdges() {
+        return Collections.unmodifiableList(outEdges);
+    }
+
+    public List<Node<N, E>> getSuccessors() {
+        ArrayList<Node<N, E>> succ = new ArrayList<Node<N, E>>();
+        for (Edge<N, E> e : getOutEdges()) {
+            Node<N, E> n = e.getDest();
+            if (!succ.contains(n)) {
+                succ.add(n);
+            }
+        }
+        return succ;
+    }
+
+    public List<Node<N, E>> getPredecessors() {
+        ArrayList<Node<N, E>> pred = new ArrayList<Node<N, E>>();
+        for (Edge<N, E> e : getInEdges()) {
+            Node<N, E> n = e.getSource();
+            if (!pred.contains(n)) {
+                pred.add(n);
+            }
+        }
+        return pred;
+    }
+
+    public N getData() {
+        return data;
+    }
+
+    public void setData(N d) {
+        data = d;
+    }
+
+    @Override
+    public String toString() {
+        return "Node: " + data;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java
new file mode 100644
index 0000000..5ed6c93
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java
@@ -0,0 +1,1222 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OldHierarchicalLayoutManager implements LayoutManager {
+
+    public static final int DUMMY_WIDTH = 0;
+    public static final int DUMMY_HEIGHT = 0;
+    public static final int LAYER_OFFSET = 50;
+    public static final int OFFSET = 8;
+    public static final boolean VERTICAL_LAYOUT = true;
+    public static final boolean ASSERT = false;
+    public static final boolean TRACE = false;
+    public static final Timing initTiming = new Timing("init");
+    public static final Timing removeCyclesTiming = new Timing("removeCycles");
+    public static final Timing reversedEdgesTiming = new Timing("reversedEdges");
+    public static final Timing assignLayersTiming = new Timing("assignLayers");
+    public static final Timing dummyNodesTiming = new Timing("dummyNodes");
+    public static final Timing crossingReductionTiming = new Timing("crossingReduction");
+    public static final Timing assignCoordinatesTiming = new Timing("assignCoordinates");
+    public static final Timing assignRealTiming = new Timing("assignReal");
+    public static final Timing rootVertexTiming = new Timing("rootVertex");
+    public static final Timing createEdgesTiming = new Timing("createEdges");
+    public static final Timing optimizeMedianTiming = new Timing("optimizeMedian");
+    private Combine combine;
+
+    public enum Combine {
+
+        NONE,
+        SAME_INPUTS,
+        SAME_OUTPUTS
+    }
+
+    private class NodeData {
+
+        private Map<Port, Integer> reversePositions;
+        private Vertex node;
+        private Link edge;
+        private int layer;
+        private int x;
+        private int y;
+        private int width;
+
+        public NodeData(Vertex node) {
+            reversePositions = new HashMap<Port, Integer>();
+            layer = -1;
+            this.node = node;
+            assert node != null;
+
+            if (VERTICAL_LAYOUT) {
+                width = node.getSize().width;
+            } else {
+                width = node.getSize().height;
+            }
+        }
+
+        public NodeData(Link edge) {
+            layer = -1;
+            this.edge = edge;
+            assert edge != null;
+
+            if (VERTICAL_LAYOUT) {
+                width = DUMMY_WIDTH;
+            } else {
+                width = DUMMY_HEIGHT;
+            }
+        }
+
+        public Vertex getNode() {
+            return node;
+        }
+
+        public Link getEdge() {
+            return edge;
+        }
+
+        public int getCoordinate() {
+            return x;
+        }
+
+        public void setCoordinate(int x) {
+            this.x = x;
+        }
+
+        public int getX() {
+            if (VERTICAL_LAYOUT) {
+                return x;
+            } else {
+                return y;
+            }
+        }
+
+        public int getY() {
+            if (VERTICAL_LAYOUT) {
+                return y;
+            } else {
+                return x;
+            }
+        }
+
+        public void setLayerCoordinate(int y) {
+            this.y = y;
+        }
+
+        public void setLayer(int x) {
+            layer = x;
+        }
+
+        public int getLayer() {
+            return layer;
+        }
+
+        public boolean isDummy() {
+            return edge != null;
+        }
+
+        public int getWidth() {
+            return width;
+        }
+
+        public void addReversedStartEdge(Edge<NodeData, EdgeData> e) {
+            assert e.getData().isReversed();
+            Port port = e.getData().getEdge().getTo();
+            int pos = addReversedPort(port);
+            Point start = e.getData().getRelativeStart();
+            e.getData().addStartPoint(start);
+            int yCoord = node.getSize().height + width - node.getSize().width;
+            e.getData().addStartPoint(new Point(start.x, yCoord));
+            e.getData().addStartPoint(new Point(pos, yCoord));
+            e.getData().setRelativeStart(new Point(pos, 0));
+        }
+
+        private int addReversedPort(Port p) {
+            if (reversePositions.containsKey(p)) {
+                return reversePositions.get(p);
+            } else {
+                width += OFFSET;
+                reversePositions.put(p, width);
+                return width;
+            }
+        }
+
+        public void addReversedEndEdge(Edge<NodeData, EdgeData> e) {
+            assert e.getData().isReversed();
+            int pos = addReversedPort(e.getData().getEdge().getFrom());
+            Point end = e.getData().getRelativeEnd();
+            e.getData().setRelativeEnd(new Point(pos, node.getSize().height));
+            int yCoord = 0 - width + node.getSize().width;
+            e.getData().addEndPoint(new Point(pos, yCoord));
+            e.getData().addEndPoint(new Point(end.x, yCoord));
+            e.getData().addEndPoint(end);
+        }
+
+        public int getHeight() {
+            if (isDummy()) {
+                if (VERTICAL_LAYOUT) {
+                    return DUMMY_HEIGHT;
+                } else {
+                    return DUMMY_WIDTH;
+                }
+
+            } else {
+                if (VERTICAL_LAYOUT) {
+                    return node.getSize().height;
+                } else {
+                    return node.getSize().width;
+                }
+            }
+        }
+
+        @Override
+        public String toString() {
+            if (isDummy()) {
+                return edge.toString() + "(layer=" + layer + ")";
+            } else {
+                return node.toString() + "(layer=" + layer + ")";
+            }
+        }
+    }
+
+    private class EdgeData {
+
+        private Point relativeEnd;
+        private Point relativeStart;
+        private List<Point> startPoints;
+        private List<Point> endPoints;
+        private boolean important;
+        private boolean reversed;
+        private Link edge;
+
+        public EdgeData(Link edge) {
+            this(edge, false);
+        }
+
+        public EdgeData(Link edge, boolean rev) {
+            this.edge = edge;
+            reversed = rev;
+            relativeStart = edge.getFrom().getRelativePosition();
+            relativeEnd = edge.getTo().getRelativePosition();
+            assert relativeStart.x >= 0 && relativeStart.x <= edge.getFrom().getVertex().getSize().width;
+            assert relativeStart.y >= 0 && relativeStart.y <= edge.getFrom().getVertex().getSize().height;
+            assert relativeEnd.x >= 0 && relativeEnd.x <= edge.getTo().getVertex().getSize().width;
+            assert relativeEnd.y >= 0 && relativeEnd.y <= edge.getTo().getVertex().getSize().height;
+            startPoints = new ArrayList<Point>();
+            endPoints = new ArrayList<Point>();
+            this.important = true;
+        }
+
+        public boolean isImportant() {
+            return important;
+        }
+
+        public void setImportant(boolean b) {
+            this.important = b;
+        }
+
+        public List<Point> getStartPoints() {
+            return startPoints;
+        }
+
+        public List<Point> getEndPoints() {
+            return endPoints;
+        }
+
+        public List<Point> getAbsoluteEndPoints() {
+            if (endPoints.size() == 0) {
+                return endPoints;
+            }
+
+            List<Point> result = new ArrayList<Point>();
+            Point point = edge.getTo().getVertex().getPosition();
+            for (Point p : endPoints) {
+                Point p2 = new Point(p.x + point.x, p.y + point.y);
+                result.add(p2);
+            }
+
+            return result;
+        }
+
+        public List<Point> getAbsoluteStartPoints() {
+            if (startPoints.size() == 0) {
+                return startPoints;
+            }
+
+            List<Point> result = new ArrayList<Point>();
+            Point point = edge.getFrom().getVertex().getPosition();
+            for (Point p : startPoints) {
+                Point p2 = new Point(p.x + point.x, p.y + point.y);
+                result.add(p2);
+            }
+
+            return result;
+        }
+
+        public void addEndPoint(Point p) {
+            endPoints.add(p);
+        }
+
+        public void addStartPoint(Point p) {
+            startPoints.add(p);
+        }
+
+        public Link getEdge() {
+            return edge;
+        }
+
+        public void setRelativeEnd(Point p) {
+            relativeEnd = p;
+        }
+
+        public void setRelativeStart(Point p) {
+            relativeStart = p;
+        }
+
+        public Point getRelativeEnd() {
+            return relativeEnd;
+        }
+
+        public Point getRelativeStart() {
+            return relativeStart;
+        }
+
+        public boolean isReversed() {
+            return reversed;
+        }
+
+        public void setReversed(boolean b) {
+            reversed = b;
+        }
+
+        @Override
+        public String toString() {
+            return "EdgeData[reversed=" + reversed + "]";
+        }
+    }
+    private Graph<NodeData, EdgeData> graph;
+    private Map<Vertex, Node<NodeData, EdgeData>> nodeMap;
+    private int layerOffset;
+
+    /** Creates a new instance of HierarchicalPositionManager */
+    public OldHierarchicalLayoutManager(Combine combine) {
+        this(combine, LAYER_OFFSET);
+    }
+
+    public OldHierarchicalLayoutManager(Combine combine, int layerOffset) {
+        this.combine = combine;
+        this.layerOffset = layerOffset;
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    }
+
+    //public void setPositions(PositionedNode rootNode, List<? extends PositionedNode> nodes, List<? extends PositionedEdge> edges) {
+    public void doLayout(LayoutGraph layoutGraph) {
+        doLayout(layoutGraph, new HashSet<Vertex>(), new HashSet<Vertex>());
+    }
+
+    public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint) {
+        doLayout(layoutGraph, firstLayerHint, lastLayerHint, new HashSet<Link>());
+    }
+
+    public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinksHint) {
+
+        if (TRACE) {
+            System.out.println("HierarchicalPositionManager.doLayout called");
+            System.out.println("Vertex count = " + layoutGraph.getVertices().size() + " Link count = " + layoutGraph.getLinks().size());
+        }
+
+        // Nothing to do => quit immediately
+        if (layoutGraph.getVertices().size() == 0) {
+            return;
+        }
+
+        initTiming.start();
+
+        // Mapping vertex to Node in graph
+        nodeMap = new HashMap<Vertex, Node<NodeData, EdgeData>>();
+
+        graph = new Graph<NodeData, EdgeData>();
+
+        Set<Node<NodeData, EdgeData>> rootNodes = new HashSet<Node<NodeData, EdgeData>>();
+        Set<Vertex> startRootVertices = new HashSet<Vertex>();
+
+        for (Vertex v : layoutGraph.getVertices()) {
+            if (v.isRoot()) {
+                startRootVertices.add(v);
+            }
+        }
+
+        rootVertexTiming.start();
+        Set<Vertex> rootVertices = layoutGraph.findRootVertices(startRootVertices);
+        rootVertexTiming.stop();
+
+
+        for (Vertex node : layoutGraph.getVertices()) {
+
+            NodeData data = new NodeData(node);
+            Node<NodeData, EdgeData> n = graph.createNode(data, node);
+            nodeMap.put(node, n);
+
+            if (rootVertices.contains(node)) {
+                rootNodes.add(n);
+            }
+        }
+
+        Set<? extends Link> links = layoutGraph.getLinks();
+        Link[] linkArr = new Link[links.size()];
+        links.toArray(linkArr);
+
+        List<Link> linkList = new ArrayList<Link>();
+        for (Link l : linkArr) {
+            linkList.add(l);
+        }
+
+        createEdgesTiming.start();
+        Collections.sort(linkList, new Comparator<Link>() {
+
+            public int compare(Link o1, Link o2) {
+                int result = o1.getFrom().getVertex().compareTo(o2.getFrom().getVertex());
+                if (result == 0) {
+                    return o1.getTo().getVertex().compareTo(o2.getTo().getVertex());
+                } else {
+                    return result;
+                }
+            }
+        });
+
+        for (Link edge : linkList) {
+            EdgeData data = new EdgeData(edge);
+            graph.createEdge(graph.getNode(edge.getFrom().getVertex()), graph.getNode(edge.getTo().getVertex()), data, data);
+            if (importantLinksHint.size() > 0 && !importantLinksHint.contains(edge)) {
+                data.setImportant(false);
+            }
+        }
+        createEdgesTiming.stop();
+
+        initTiming.stop();
+
+        removeCyclesTiming.start();
+
+        // STEP 1: Remove cycles!
+        removeCycles(rootNodes);
+        if (ASSERT) {
+            assert checkRemoveCycles();
+        }
+
+        removeCyclesTiming.stop();
+
+        reversedEdgesTiming.start();
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+            Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+                public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+                    return o2.getData().getRelativeEnd().x - o1.getData().getRelativeEnd().x;
+                }
+            });
+
+
+            for (Edge<NodeData, EdgeData> e : edges) {
+
+                if (e.getData().isReversed()) {
+                    e.getSource().getData().addReversedEndEdge(e);
+                }
+            }
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getInEdges());
+            Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+                public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+                    return o2.getData().getRelativeStart().x - o1.getData().getRelativeStart().x;
+                }
+            });
+
+
+            for (Edge<NodeData, EdgeData> e : edges) {
+                if (e.getData().isReversed()) {
+                    e.getDest().getData().addReversedStartEdge(e);
+                }
+            }
+        }
+
+        reversedEdgesTiming.stop();
+
+        assignLayersTiming.start();
+        // STEP 2: Assign layers!
+        int maxLayer = assignLayers(rootNodes, firstLayerHint, lastLayerHint);
+        if (ASSERT) {
+            assert checkAssignLayers();
+        }
+
+        // Put into layer array
+        //int maxLayer = 0;
+        //for(Node<NodeData, EdgeData> n : graph.getNodes()) {
+        //    maxLayer = Math.max(maxLayer, n.getData().getLayer());
+        //}
+
+
+        ArrayList<Node<NodeData, EdgeData>> layers[] = new ArrayList[maxLayer + 1];
+        int layerSizes[] = new int[maxLayer + 1];
+        for (int i = 0; i < maxLayer + 1; i++) {
+            layers[i] = new ArrayList<Node<NodeData, EdgeData>>();
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            int curLayer = n.getData().getLayer();
+            layers[curLayer].add(n);
+        }
+
+        assignLayersTiming.stop();
+
+        // STEP 3: Insert dummy nodes!
+        dummyNodesTiming.start();
+        insertDummyNodes(layers);
+        if (ASSERT) {
+            assert checkDummyNodes();
+        }
+        dummyNodesTiming.stop();
+
+        crossingReductionTiming.start();
+        // STEP 4: Assign Y coordinates
+        assignLayerCoordinates(layers, layerSizes);
+
+        // STEP 5: Crossing reduction
+        crossingReduction(layers);
+        crossingReductionTiming.stop();
+
+        // STEP 6: Assign Y coordinates
+        assignCoordinatesTiming.start();
+        assignCoordinates(layers);
+        assignCoordinatesTiming.stop();
+
+        assignRealTiming.start();
+
+        // Assign coordinates of nodes to real objects
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            if (!n.getData().isDummy()) {
+
+                Vertex node = n.getData().getNode();
+                node.setPosition(new Point(n.getData().getX(), n.getData().getY()));
+            }
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            if (!n.getData().isDummy()) {
+
+                Vertex node = n.getData().getNode();
+
+                List<Edge<NodeData, EdgeData>> outEdges = n.getOutEdges();
+                for (Edge<NodeData, EdgeData> e : outEdges) {
+                    Node<NodeData, EdgeData> succ = e.getDest();
+                    if (succ.getData().isDummy()) {
+                        //PositionedEdge edge = succ.getData().getEdge();
+                        List<Point> points = new ArrayList<Point>();
+                        assignToRealObjects(layerSizes, succ, points);
+                    } else {
+                        List<Point> points = new ArrayList<Point>();
+
+                        EdgeData otherEdgeData = e.getData();
+                        points.addAll(otherEdgeData.getAbsoluteStartPoints());
+                        Link otherEdge = otherEdgeData.getEdge();
+                        Point relFrom = new Point(otherEdgeData.getRelativeStart());
+                        Point from = otherEdge.getFrom().getVertex().getPosition();
+                        relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+                        points.add(relFrom);
+
+                        Point relTo = new Point(otherEdgeData.getRelativeEnd());
+                        Point to = otherEdge.getTo().getVertex().getPosition();
+                        relTo.move(relTo.x + to.x, relTo.y + to.y);
+                        assert from != null;
+                        assert to != null;
+                        points.add(relTo);
+                        points.addAll(otherEdgeData.getAbsoluteEndPoints());
+                        e.getData().getEdge().setControlPoints(points);
+                    }
+                }
+            }
+        }
+
+        assignRealTiming.stop();
+
+        initTiming.print();
+        removeCyclesTiming.print();
+        reversedEdgesTiming.print();
+        assignLayersTiming.print();
+        dummyNodesTiming.print();
+        crossingReductionTiming.print();
+        assignCoordinatesTiming.print();
+        assignRealTiming.print();
+        rootVertexTiming.print();
+        createEdgesTiming.print();
+        optimizeMedianTiming.print();
+    }
+
+    public boolean onOneLine(Point p1, Point p2, Point p3) {
+        int xoff1 = p1.x - p2.x;
+        int yoff1 = p1.y - p2.y;
+        int xoff2 = p3.x - p2.x;
+        int yoff2 = p3.y - p2.x;
+
+        return (xoff1 * yoff2 - yoff1 * xoff2 == 0);
+    }
+
+    private void assignToRealObjects(int layerSizes[], Node<NodeData, EdgeData> cur, List<Point> points) {
+        assert cur.getData().isDummy();
+
+        ArrayList<Point> otherPoints = new ArrayList<Point>(points);
+
+        int size = layerSizes[cur.getData().getLayer()];
+        otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() - size / 2));
+        if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+            otherPoints.remove(otherPoints.size() - 2);
+        }
+        otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() + size / 2));
+        if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+            otherPoints.remove(otherPoints.size() - 2);
+        }
+
+        for (int i = 0; i < cur.getOutEdges().size(); i++) {
+            Node<NodeData, EdgeData> otherSucc = cur.getOutEdges().get(i).getDest();
+
+            if (otherSucc.getData().isDummy()) {
+                assignToRealObjects(layerSizes, otherSucc, otherPoints);
+            } else {
+                EdgeData otherEdgeData = cur.getOutEdges().get(i).getData();
+                Link otherEdge = otherEdgeData.getEdge();
+
+                List<Point> middlePoints = new ArrayList<Point>(otherPoints);
+                if (cur.getOutEdges().get(i).getData().isReversed()) {
+                    Collections.reverse(middlePoints);
+                }
+
+                ArrayList<Point> copy = new ArrayList<Point>();
+                Point relFrom = new Point(otherEdgeData.getRelativeStart());
+                Point from = otherEdge.getFrom().getVertex().getPosition();
+                //int moveUp = (size - otherEdge.getFrom().getVertex().getSize().height) / 2;
+                relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+                copy.addAll(otherEdgeData.getAbsoluteStartPoints());
+                copy.add(relFrom);
+                copy.addAll(middlePoints);
+
+                Point relTo = new Point(otherEdgeData.getRelativeEnd());
+                Point to = otherEdge.getTo().getVertex().getPosition();
+                relTo.move(relTo.x + to.x, relTo.y + to.y);
+                copy.add(relTo);
+
+                copy.addAll(otherEdgeData.getAbsoluteEndPoints());
+
+
+                otherEdge.setControlPoints(copy);
+            }
+        }
+    }
+
+    private boolean checkDummyNodes() {
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            if (e.getSource().getData().getLayer() != e.getDest().getData().getLayer() - 1) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void insertDummyNodes(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        int sum = 0;
+        List<Node<NodeData, EdgeData>> nodes = new ArrayList<Node<NodeData, EdgeData>>(graph.getNodes());
+        int edgeCount = 0;
+        int innerMostLoop = 0;
+
+        for (Node<NodeData, EdgeData> n : nodes) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+            for (Edge<NodeData, EdgeData> e : edges) {
+
+                edgeCount++;
+                Link edge = e.getData().getEdge();
+                Node<NodeData, EdgeData> destNode = e.getDest();
+                Node<NodeData, EdgeData> lastNode = n;
+                Edge<NodeData, EdgeData> lastEdge = e;
+
+                boolean searchForNode = (combine != Combine.NONE);
+                for (int i = n.getData().getLayer() + 1; i < destNode.getData().getLayer(); i++) {
+
+                    Node<NodeData, EdgeData> foundNode = null;
+                    if (searchForNode) {
+                        for (Node<NodeData, EdgeData> sameLayerNode : layers[i]) {
+                            innerMostLoop++;
+
+                            if (combine == Combine.SAME_OUTPUTS) {
+                                if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getFrom() == edge.getFrom()) {
+                                    foundNode = sameLayerNode;
+                                    break;
+                                }
+                            } else if (combine == Combine.SAME_INPUTS) {
+                                if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getTo() == edge.getTo()) {
+                                    foundNode = sameLayerNode;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+
+                    if (foundNode == null) {
+                        searchForNode = false;
+                        NodeData intermediateData = new NodeData(edge);
+                        Node<NodeData, EdgeData> curNode = graph.createNode(intermediateData, null);
+                        curNode.getData().setLayer(i);
+                        layers[i].add(0, curNode);
+                        sum++;
+                        lastEdge.remove();
+                        graph.createEdge(lastNode, curNode, e.getData(), null);
+                        assert lastNode.getData().getLayer() == curNode.getData().getLayer() - 1;
+                        lastEdge = graph.createEdge(curNode, destNode, e.getData(), null);
+                        lastNode = curNode;
+                    } else {
+                        lastEdge.remove();
+                        lastEdge = graph.createEdge(foundNode, destNode, e.getData(), null);
+                        lastNode = foundNode;
+                    }
+
+                }
+            }
+        }
+
+        if (TRACE) {
+            System.out.println("Number of edges: " + edgeCount);
+        }
+        if (TRACE) {
+            System.out.println("Dummy nodes inserted: " + sum);
+        }
+    }
+
+    private void assignLayerCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[], int layerSizes[]) {
+        int cur = 0;
+        for (int i = 0; i < layers.length; i++) {
+            int maxHeight = 0;
+            for (Node<NodeData, EdgeData> n : layers[i]) {
+                maxHeight = Math.max(maxHeight, n.getData().getHeight());
+            }
+
+            layerSizes[i] = maxHeight;
+            for (Node<NodeData, EdgeData> n : layers[i]) {
+                int curCoordinate = cur + (maxHeight - n.getData().getHeight()) / 2;
+                n.getData().setLayerCoordinate(curCoordinate);
+            }
+            cur += maxHeight + layerOffset;
+
+        }
+    }
+
+    private void assignCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        // TODO: change this
+        for (int i = 0; i < layers.length; i++) {
+            ArrayList<Node<NodeData, EdgeData>> curArray = layers[i];
+            int curY = 0;
+            for (Node<NodeData, EdgeData> n : curArray) {
+
+                n.getData().setCoordinate(curY);
+                if (!n.getData().isDummy()) {
+                    curY += n.getData().getWidth();
+                }
+                curY += OFFSET;
+
+            }
+        }
+
+        int curSol = evaluateSolution();
+        if (TRACE) {
+            System.out.println("First coordinate solution found: " + curSol);
+        }
+
+        // Sort to correct order
+        for (int i = 0; i < layers.length; i++) {
+            Collections.sort(layers[i], new Comparator<Node<NodeData, EdgeData>>() {
+
+                public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                    if (o2.getData().isDummy()) {
+                        return 1;
+                    } else if (o1.getData().isDummy()) {
+                        return -1;
+                    }
+                    return o2.getInEdges().size() + o2.getOutEdges().size() - o1.getInEdges().size() - o1.getOutEdges().size();
+                }
+            });
+        }
+
+
+        optimizeMedianTiming.start();
+        for (int i = 0; i < 2; i++) {
+            optimizeMedian(layers);
+            curSol = evaluateSolution();
+            if (TRACE) {
+                System.out.println("Current coordinate solution found: " + curSol);
+            }
+        }
+        optimizeMedianTiming.stop();
+        normalizeCoordinate();
+
+    }
+
+    private void normalizeCoordinate() {
+
+        int min = Integer.MAX_VALUE;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            min = Math.min(min, n.getData().getCoordinate());
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            n.getData().setCoordinate(n.getData().getCoordinate() - min);
+        }
+
+    }
+
+    private void optimizeMedian(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        // Downsweep
+        for (int i = 1; i < layers.length; i++) {
+
+            ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+            for (Node<NodeData, EdgeData> n : processingList) {
+
+
+                ArrayList<Node<NodeData, EdgeData>> preds = new ArrayList<Node<NodeData, EdgeData>>(n.getPredecessors());
+                int pos = n.getData().getCoordinate();
+                if (preds.size() > 0) {
+
+                    Collections.sort(preds, new Comparator<Node<NodeData, EdgeData>>() {
+
+                        public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                            return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+                        }
+                    });
+
+                    if (preds.size() % 2 == 0) {
+                        assert preds.size() >= 2;
+                        pos = (preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n) + preds.get(preds.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2 - 1), n)) / 2;
+                    } else {
+                        assert preds.size() >= 1;
+                        pos = preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n);
+                    }
+                }
+
+                tryAdding(alreadyAssigned, n, pos);
+            }
+        }
+        // Upsweep
+        for (int i = layers.length - 2; i >= 0; i--) {
+            ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+            for (Node<NodeData, EdgeData> n : processingList) {
+
+                ArrayList<Node<NodeData, EdgeData>> succs = new ArrayList<Node<NodeData, EdgeData>>(n.getSuccessors());
+                int pos = n.getData().getCoordinate();
+                if (succs.size() > 0) {
+
+                    Collections.sort(succs, new Comparator<Node<NodeData, EdgeData>>() {
+
+                        public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                            return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+                        }
+                    });
+
+                    if (succs.size() % 2 == 0) {
+                        assert succs.size() >= 2;
+                        pos = (succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2)) + succs.get(succs.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2 - 1))) / 2;
+                    } else {
+                        assert succs.size() >= 1;
+                        pos = succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2));
+                    }
+                }
+
+                tryAdding(alreadyAssigned, n, pos);
+            }
+        }
+    }
+
+    private int median(ArrayList<Integer> arr) {
+        assert arr.size() > 0;
+        Collections.sort(arr);
+        if (arr.size() % 2 == 0) {
+            return (arr.get(arr.size() / 2) + arr.get(arr.size() / 2 - 1)) / 2;
+        } else {
+            return arr.get(arr.size() / 2);
+        }
+    }
+
+    private int calcRelativeCoordinate(Node<NodeData, EdgeData> n, Node<NodeData, EdgeData> succ) {
+
+        if (n.getData().isDummy() && succ.getData().isDummy()) {
+            return 0;
+        }
+
+        int pos = 0;
+        int pos2 = 0;
+        ArrayList<Integer> coords2 = new ArrayList<Integer>();
+        ArrayList<Integer> coords = new ArrayList<Integer>();
+        /*if(!n.getData().isDummy())*/ {
+            for (Edge<NodeData, EdgeData> e : n.getOutEdges()) {
+
+                //System.out.println("reversed: " + e.getData().isReversed());
+                if (e.getDest() == succ) {
+
+                    if (e.getData().isReversed()) {
+                        if (!n.getData().isDummy()) {
+                            coords.add(e.getData().getRelativeEnd().x);
+                        }
+
+                        if (!succ.getData().isDummy()) {
+                            coords2.add(e.getData().getRelativeStart().x);
+                        }
+                    } else {
+                        if (!n.getData().isDummy()) {
+                            coords.add(e.getData().getRelativeStart().x);
+                        }
+
+                        if (!succ.getData().isDummy()) {
+                            coords2.add(e.getData().getRelativeEnd().x);
+                        }
+                    }
+                }
+            }
+
+            // assert coords.size() > 0;
+            if (!n.getData().isDummy()) {
+                pos = median(coords);
+            }
+
+            if (!succ.getData().isDummy()) {
+                pos2 = median(coords2);
+            }
+        }
+        //System.out.println("coords=" + coords);
+        //System.out.println("coords2=" + coords2);
+
+        return pos - pos2;
+    }
+
+    private boolean intersect(int v1, int w1, int v2, int w2) {
+        if (v1 >= v2 && v1 < v2 + w2) {
+            return true;
+        }
+        if (v1 + w1 > v2 && v1 + w1 < v2 + w2) {
+            return true;
+        }
+        if (v1 < v2 && v1 + w1 > v2) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean intersect(Node<NodeData, EdgeData> n1, Node<NodeData, EdgeData> n2) {
+        return intersect(n1.getData().getCoordinate(), n1.getData().getWidth() + OFFSET, n2.getData().getCoordinate(), n2.getData().getWidth() + OFFSET);
+    }
+
+    private void tryAdding(List<Node<NodeData, EdgeData>> alreadyAssigned, Node<NodeData, EdgeData> node, int pos) {
+
+        boolean doesIntersect = false;
+        node.getData().setCoordinate(pos);
+        for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+            if (n.getData().getCoordinate() + n.getData().getWidth() < pos) {
+                break;
+            } else if (intersect(node, n)) {
+                doesIntersect = true;
+                break;
+            }
+
+        }
+
+        if (!doesIntersect) {
+
+            // Everything fine, just place the node
+            int z = 0;
+            for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+                if (pos > n.getData().getCoordinate()) {
+                    break;
+                }
+                z++;
+            }
+
+            if (z == -1) {
+                z = alreadyAssigned.size();
+            }
+
+
+            if (ASSERT) {
+                assert !findOverlap(alreadyAssigned, node);
+            }
+            alreadyAssigned.add(z, node);
+
+        } else {
+
+            assert alreadyAssigned.size() > 0;
+
+            // Search for alternative location
+            int minOffset = Integer.MAX_VALUE;
+            int minIndex = -1;
+            int minPos = 0;
+            int w = node.getData().getWidth() + OFFSET;
+
+            // Try top-most
+            minIndex = 0;
+            minPos = alreadyAssigned.get(0).getData().getCoordinate() + alreadyAssigned.get(0).getData().getWidth() + OFFSET;
+            minOffset = Math.abs(minPos - pos);
+
+            // Try bottom-most
+            Node<NodeData, EdgeData> lastNode = alreadyAssigned.get(alreadyAssigned.size() - 1);
+            int lastPos = lastNode.getData().getCoordinate() - w;
+            int lastOffset = Math.abs(lastPos - pos);
+            if (lastOffset < minOffset) {
+                minPos = lastPos;
+                minOffset = lastOffset;
+                minIndex = alreadyAssigned.size();
+            }
+
+            // Try between
+            for (int i = 0; i < alreadyAssigned.size() - 1; i++) {
+                Node<NodeData, EdgeData> curNode = alreadyAssigned.get(i);
+                Node<NodeData, EdgeData> nextNode = alreadyAssigned.get(i + 1);
+
+                int start = nextNode.getData().getCoordinate() + nextNode.getData().getWidth() + OFFSET;
+                int end = curNode.getData().getCoordinate() - OFFSET;
+
+                int bestPoss = end - node.getData().getWidth();
+                if (bestPoss < pos && pos - bestPoss > minOffset) {
+                    // No better solution possible => break
+                    break;
+                }
+
+                if (end - start >= node.getData().getWidth()) {
+                    // Node could fit here
+                    int cand1 = start;
+                    int cand2 = end - node.getData().getWidth();
+                    int off1 = Math.abs(cand1 - pos);
+                    int off2 = Math.abs(cand2 - pos);
+                    if (off1 < minOffset) {
+                        minPos = cand1;
+                        minOffset = off1;
+                        minIndex = i + 1;
+                    }
+
+                    if (off2 < minOffset) {
+                        minPos = cand2;
+                        minOffset = off2;
+                        minIndex = i + 1;
+                    }
+                }
+            }
+
+            assert minIndex != -1;
+            node.getData().setCoordinate(minPos);
+            if (ASSERT) {
+                assert !findOverlap(alreadyAssigned, node);
+            }
+            alreadyAssigned.add(minIndex, node);
+        }
+
+    }
+
+    private boolean findOverlap(List<Node<NodeData, EdgeData>> nodes, Node<NodeData, EdgeData> node) {
+
+        for (Node<NodeData, EdgeData> n1 : nodes) {
+            if (intersect(n1, node)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private int evaluateSolution() {
+
+        int sum = 0;
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            Node<NodeData, EdgeData> source = e.getSource();
+            Node<NodeData, EdgeData> dest = e.getDest();
+            int offset = 0;
+            offset = Math.abs(source.getData().getCoordinate() - dest.getData().getCoordinate());
+            sum += offset;
+        }
+
+        return sum;
+    }
+
+    private void crossingReduction(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        for (int i = 0; i < layers.length - 1; i++) {
+
+            ArrayList<Node<NodeData, EdgeData>> curNodes = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> nextNodes = layers[i + 1];
+            for (Node<NodeData, EdgeData> n : curNodes) {
+                for (Node<NodeData, EdgeData> succ : n.getSuccessors()) {
+                    if (ASSERT) {
+                        assert nextNodes.contains(succ);
+                    }
+                    nextNodes.remove(succ);
+                    nextNodes.add(succ);
+                }
+            }
+
+        }
+
+    }
+
+    private void removeCycles(Set<Node<NodeData, EdgeData>> rootNodes) {
+        final List<Edge<NodeData, EdgeData>> reversedEdges = new ArrayList<Edge<NodeData, EdgeData>>();
+
+
+        int removedCount = 0;
+        int reversedCount = 0;
+
+        Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() {
+
+            @Override
+            public boolean visitEdge(Edge<NodeData, EdgeData> e, boolean backEdge) {
+                if (backEdge) {
+                    if (ASSERT) {
+                        assert !reversedEdges.contains(e);
+                    }
+                    reversedEdges.add(e);
+                    e.getData().setReversed(!e.getData().isReversed());
+                }
+
+                return e.getData().isImportant();
+            }
+        };
+        Set<Node<NodeData, EdgeData>> nodes = new HashSet<Node<NodeData, EdgeData>>();
+        nodes.addAll(rootNodes);
+
+        assert nodes.size() > 0;
+
+        this.graph.traverseDFS(nodes, visitor);
+
+        for (Edge<NodeData, EdgeData> e : reversedEdges) {
+            if (e.isSelfLoop()) {
+                e.remove();
+                removedCount++;
+            } else {
+                e.reverse();
+                reversedCount++;
+            }
+        }
+    }
+
+    private boolean checkRemoveCycles() {
+        return !graph.hasCycles();
+    }
+    // Only used by assignLayers
+    private int maxLayerTemp;
+
+    private int assignLayers(Set<Node<NodeData, EdgeData>> rootNodes, Set<? extends Vertex> firstLayerHints,
+            Set<? extends Vertex> lastLayerHints) {
+        this.maxLayerTemp = -1;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            n.getData().setLayer(-1);
+        }
+
+        Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() {
+
+            @Override
+            public void visitNode(Node<NodeData, EdgeData> n, int depth) {
+                if (depth > n.getData().getLayer()) {
+                    n.getData().setLayer(depth);
+                    maxLayerTemp = Math.max(maxLayerTemp, depth);
+                }
+            }
+        };
+
+        for (Node<NodeData, EdgeData> n : rootNodes) {
+            if (n.getData().getLayer() == -1) {
+                this.graph.traverseBFS(n, traverser, true);
+            }
+        }
+
+        for (Vertex v : firstLayerHints) {
+            assert nodeMap.containsKey(v);
+            nodeMap.get(v).getData().setLayer(0);
+        }
+
+        for (Vertex v : lastLayerHints) {
+            assert nodeMap.containsKey(v);
+            nodeMap.get(v).getData().setLayer(maxLayerTemp);
+        }
+
+        return maxLayerTemp;
+    }
+
+    private boolean checkAssignLayers() {
+
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            Node<NodeData, EdgeData> source = e.getSource();
+            Node<NodeData, EdgeData> dest = e.getDest();
+
+
+            if (source.getData().getLayer() >= dest.getData().getLayer()) {
+                return false;
+            }
+        }
+        int maxLayer = 0;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            assert n.getData().getLayer() >= 0;
+            if (n.getData().getLayer() > maxLayer) {
+                maxLayer = n.getData().getLayer();
+            }
+        }
+
+        int countPerLayer[] = new int[maxLayer + 1];
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            countPerLayer[n.getData().getLayer()]++;
+        }
+
+        if (TRACE) {
+            System.out.println("Number of layers: " + maxLayer);
+        }
+        return true;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java
new file mode 100644
index 0000000..fe6cd28
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Timing {
+
+    private long lastValue;
+    private long sum;
+    private String name;
+
+    public Timing(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        long val = sum;
+        if (lastValue != 0) {
+            // Timer running
+            long newValue = System.nanoTime();
+            val += (newValue - lastValue);
+        }
+        return "Timing for " + name + " is: " + val / 1000000 + " ms";
+    }
+
+    public void print() {
+        System.out.println(toString());
+    }
+
+    public void start() {
+        lastValue = System.nanoTime();
+    }
+
+    public void stop() {
+        if (lastValue == 0) {
+            throw new IllegalStateException("You must call start before stop");
+        }
+        long newValue = System.nanoTime();
+        sum += newValue - lastValue;
+        lastValue = 0;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml
new file mode 100644
index 0000000..002f9bc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.layout" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.layout.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf
new file mode 100644
index 0000000..eafc236
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.layout

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/layout/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml
new file mode 100644
index 0000000..84413d2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.layout-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties
new file mode 100644
index 0000000..f054d11
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=cb0889d9
+build.xml.script.CRC32=d65fccb9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=cb0889d9
+nbproject/build-impl.xml.script.CRC32=7f82736d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml
new file mode 100644
index 0000000..edd56a5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.layout</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties
new file mode 100644
index 0000000..578627a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=Layout
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java
new file mode 100644
index 0000000..a4bfda5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Rectangle;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Cluster extends Comparable<Cluster> {
+
+    public Cluster getOuter();
+
+    public void setBounds(Rectangle r);
+
+    public Set<? extends Cluster> getSuccessors();
+
+    public Set<? extends Cluster> getPredecessors();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java
new file mode 100644
index 0000000..ac262c9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LayoutGraph {
+
+    private Set<? extends Link> links;
+    private SortedSet<Vertex> vertices;
+    private Hashtable<Vertex, Set<Port>> inputPorts;
+    private Hashtable<Vertex, Set<Port>> outputPorts;
+    private Hashtable<Port, Set<Link>> portLinks;
+
+    public LayoutGraph(Set<? extends Link> links) {
+        this(links, new HashSet<Vertex>());
+    }
+
+    public LayoutGraph(Set<? extends Link> links, Set<? extends Vertex> additionalVertices) {
+        this.links = links;
+        assert verify();
+
+        vertices = new TreeSet<Vertex>();
+        portLinks = new Hashtable<Port, Set<Link>>();
+        inputPorts = new Hashtable<Vertex, Set<Port>>();
+        outputPorts = new Hashtable<Vertex, Set<Port>>();
+
+        for (Link l : links) {
+            Port p = l.getFrom();
+            Port p2 = l.getTo();
+            Vertex v1 = p.getVertex();
+            Vertex v2 = p2.getVertex();
+
+            if (!vertices.contains(v1)) {
+
+                outputPorts.put(v1, new HashSet<Port>(1));
+                inputPorts.put(v1, new HashSet<Port>(3));
+                vertices.add(v1);
+                assert vertices.contains(v1);
+            }
+
+            if (!vertices.contains(v2)) {
+                vertices.add(v2);
+                assert vertices.contains(v2);
+                outputPorts.put(v2, new HashSet<Port>(1));
+                inputPorts.put(v2, new HashSet<Port>(3));
+            }
+
+            if (!portLinks.containsKey(p)) {
+                HashSet<Link> hashSet = new HashSet<Link>(3);
+                portLinks.put(p, hashSet);
+            }
+
+            if (!portLinks.containsKey(p2)) {
+                portLinks.put(p2, new HashSet<Link>(3));
+            }
+
+            outputPorts.get(v1).add(p);
+            inputPorts.get(v2).add(p2);
+
+            portLinks.get(p).add(l);
+            portLinks.get(p2).add(l);
+        }
+
+        for (Vertex v : additionalVertices) {
+            if (!vertices.contains(v)) {
+                outputPorts.put(v, new HashSet<Port>(1));
+                inputPorts.put(v, new HashSet<Port>(3));
+                vertices.add(v);
+                vertices.contains(v);
+            }
+        }
+    }
+
+    public Set<Port> getInputPorts(Vertex v) {
+        return this.inputPorts.get(v);
+    }
+
+    public Set<Port> getOutputPorts(Vertex v) {
+        return this.outputPorts.get(v);
+    }
+
+    public Set<Link> getPortLinks(Port p) {
+        return portLinks.get(p);
+    }
+
+    public Set<? extends Link> getLinks() {
+        return links;
+    }
+
+    public boolean verify() {
+        return true;
+    }
+
+    public SortedSet<Vertex> getVertices() {
+        return vertices;
+    }
+
+    private void markNotRoot(Set<Vertex> notRootSet, Vertex v, Vertex startingVertex) {
+
+        if (notRootSet.contains(v)) {
+            return;
+        }
+        if (v != startingVertex) {
+            notRootSet.add(v);
+        }
+        Set<Port> outPorts = getOutputPorts(v);
+        for (Port p : outPorts) {
+            Set<Link> portLinks = getPortLinks(p);
+            for (Link l : portLinks) {
+                Port other = l.getTo();
+                Vertex otherVertex = other.getVertex();
+                if (otherVertex != startingVertex) {
+                    markNotRoot(notRootSet, otherVertex, startingVertex);
+                }
+            }
+        }
+    }
+
+    // Returns a set of vertices with the following properties:
+    // - All Vertices in the set startingRoots are elements of the set.
+    // - When starting a DFS at every vertex in the set, every vertex of the
+    //   whole graph is visited.
+    public Set<Vertex> findRootVertices(Set<Vertex> startingRoots) {
+
+        Set<Vertex> notRootSet = new HashSet<Vertex>();
+        for (Vertex v : startingRoots) {
+            if (!notRootSet.contains(v)) {
+                markNotRoot(notRootSet, v, v);
+            }
+        }
+
+        Set<Vertex> tmpVertices = getVertices();
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                if (this.getInputPorts(v).size() == 0) {
+                    markNotRoot(notRootSet, v, v);
+                }
+            }
+        }
+
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                markNotRoot(notRootSet, v, v);
+            }
+        }
+
+        Set<Vertex> result = new HashSet<Vertex>();
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                result.add(v);
+            }
+        }
+        assert tmpVertices.size() == 0 || result.size() > 0;
+        return result;
+    }
+
+    public Set<Vertex> findRootVertices() {
+        return findRootVertices(new HashSet<Vertex>());
+    }
+
+    public SortedSet<Cluster> getClusters() {
+
+        SortedSet<Cluster> clusters = new TreeSet<Cluster>();
+        for (Vertex v : getVertices()) {
+            if (v.getCluster() != null) {
+                clusters.add(v.getCluster());
+            }
+        }
+
+        return clusters;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java
new file mode 100644
index 0000000..25d0a5e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface LayoutManager {
+
+    public void doLayout(LayoutGraph graph);
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks);
+
+    public void doRouting(LayoutGraph graph);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java
new file mode 100644
index 0000000..b885d48
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Link {
+
+    public Port getFrom();
+
+    public Port getTo();
+
+    public List<Point> getControlPoints();
+
+    public void setControlPoints(List<Point> list);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java
new file mode 100644
index 0000000..0bfe394
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Port {
+
+    public Vertex getVertex();
+
+    public Point getRelativePosition();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java
new file mode 100644
index 0000000..3a6020b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Vertex extends Comparable<Vertex> {
+
+    public Cluster getCluster();
+
+    public Dimension getSize();
+
+    public Point getPosition();
+
+    public void setPosition(Point p);
+
+    public boolean isRoot();
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml
new file mode 100644
index 0000000..4565a3d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.connection" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.connection.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf
new file mode 100644
index 0000000..791c20d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.connection

+OpenIDE-Module-Layer: com/sun/hotspot/igv/connection/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/connection/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml
new file mode 100644
index 0000000..5e1c413
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.connection-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties
new file mode 100644
index 0000000..0897ad9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=f8e21cb6
+build.xml.script.CRC32=a265137e
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=f8e21cb6
+nbproject/build-impl.xml.script.CRC32=36f3138c
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml
new file mode 100644
index 0000000..5edaba9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.connection</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.connection</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver
new file mode 100644
index 0000000..62561a6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver
@@ -0,0 +1 @@
+com.sun.hotspot.igv.connection.Server
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties
new file mode 100644
index 0000000..6cbad75
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=NetworkConnection
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java
new file mode 100644
index 0000000..a16c2ec
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import javax.swing.JTextField;
+import org.openide.util.Exceptions;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Client implements Runnable, GroupCallback {
+
+    private Socket socket;
+    private JTextField networkTextField;
+    private GroupCallback callback;
+
+    public Client(Socket socket, JTextField networkTextField, GroupCallback callback) {
+        this.callback = callback;
+        this.socket = socket;
+        this.networkTextField = networkTextField;
+    }
+
+    public void run() {
+
+        try {
+            InputStream inputStream = socket.getInputStream();
+
+            if (networkTextField.isEnabled()) {
+
+                socket.getOutputStream().write('y');
+                InputSource is = new InputSource(inputStream);
+
+                try {
+                    XMLReader reader = XMLUtil.createXMLReader();
+                    Parser parser = new Parser(this);
+                    parser.parse(reader, is, null);
+                } catch (SAXException ex) {
+                    ex.printStackTrace();
+                }
+            } else {
+                socket.getOutputStream().write('n');
+            }
+
+            socket.close();
+        } catch (IOException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+
+    public void started(final Group g) {
+        try {
+            RegexpPropertyMatcher matcher = new RegexpPropertyMatcher("name", ".*" + networkTextField.getText() + ".*");
+            if (g.getProperties().selectSingle(matcher) != null && networkTextField.isEnabled()) {
+                socket.getOutputStream().write('y');
+                callback.started(g);
+            } else {
+                socket.getOutputStream().write('n');
+            }
+        } catch (IOException e) {
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java
new file mode 100644
index 0000000..6bd3dd6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Component;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.prefs.PreferenceChangeEvent;
+import java.util.prefs.PreferenceChangeListener;
+import javax.swing.SwingUtilities;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.RequestProcessor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Server implements GroupCallback, GroupReceiver, PreferenceChangeListener {
+
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JCheckBox networkCheckBox;
+    private javax.swing.JTextField networkTextField;
+    private ServerSocket serverSocket;
+    private GroupCallback callback;
+    private int port;
+    private Runnable serverRunnable;
+
+    public Component init(GroupCallback callback) {
+
+        this.callback = callback;
+
+        jPanel1 = new javax.swing.JPanel();
+        networkTextField = new javax.swing.JTextField();
+        networkCheckBox = new javax.swing.JCheckBox();
+
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
+        jPanel1.setLayout(new java.awt.BorderLayout(10, 10));
+        jPanel1.add(networkTextField, java.awt.BorderLayout.CENTER);
+
+        networkCheckBox.setSelected(true);
+        org.openide.awt.Mnemonics.setLocalizedText(networkCheckBox, "Receive when name contains");
+        networkCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+        networkCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+        networkCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
+
+            public void stateChanged(javax.swing.event.ChangeEvent evt) {
+                networkCheckBoxChanged(evt);
+            }
+        });
+        jPanel1.add(networkCheckBox, java.awt.BorderLayout.WEST);
+        networkCheckBox.getAccessibleContext().setAccessibleName("Read from network when name contains");
+
+        initializeNetwork();
+        Settings.get().addPreferenceChangeListener(this);
+        return jPanel1;
+    }
+
+    private void networkCheckBoxChanged(javax.swing.event.ChangeEvent evt) {
+        networkTextField.setEnabled(networkCheckBox.isSelected());
+    }
+
+    public void preferenceChange(PreferenceChangeEvent e) {
+
+        int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+        if (curPort != port) {
+            initializeNetwork();
+        }
+    }
+
+    private void initializeNetwork() {
+
+        int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+        this.port = curPort;
+        try {
+            serverSocket = new java.net.ServerSocket(curPort);
+        } catch (IOException ex) {
+            NotifyDescriptor message = new NotifyDescriptor.Message("Could not create server. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+            DialogDisplayer.getDefault().notifyLater(message);
+            return;
+        }
+
+        Runnable runnable = new Runnable() {
+
+            public void run() {
+                while (true) {
+                    try {
+                        Socket clientSocket = serverSocket.accept();
+                        if (serverRunnable != this) {
+                            clientSocket.close();
+                            return;
+                        }
+                        RequestProcessor.getDefault().post(new Client(clientSocket, networkTextField, Server.this), 0, Thread.MAX_PRIORITY);
+                    } catch (IOException ex) {
+                        serverSocket = null;
+                        NotifyDescriptor message = new NotifyDescriptor.Message("Error during listening for incoming connections. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+                        DialogDisplayer.getDefault().notifyLater(message);
+                        return;
+                    }
+                }
+            }
+        };
+
+        serverRunnable = runnable;
+
+        RequestProcessor.getDefault().post(runnable, 0, Thread.MAX_PRIORITY);
+    }
+
+    public void started(final Group g) {
+        SwingUtilities.invokeLater(new Runnable() {
+
+            public void run() {
+                callback.started(g);
+            }
+        });
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml
new file mode 100644
index 0000000..c16a8a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/README b/hotspot/src/share/tools/IdealGraphVisualizer/README
new file mode 100644
index 0000000..80e1632
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/README
@@ -0,0 +1,45 @@
+The Ideal Graph Visualizer is a tool developed to help examine the
+intermediate representation of C2 which is commonly referred to as the
+"ideal graph".  It was developed in collaboration with the University
+of Linz in Austria and has been included as part of hotspot since that
+was the primary target of the tool.  The tool itself is fairly general
+with only a few modules that contain C2 specific elements.
+
+The tool is built on top of the NetBeans 6.0 rich client
+infrastructure and so requires NetBeans to build.  It currently
+requires Java 6 to run as it needs support for JavaScript for its
+filtering mechanism and assumes it's built into the platform.  It
+should build out of the box whit NetBeans 6 and Java 6 or later.  It's
+possible to run it on 1.5 by including Rhino on the classpath though
+that currently isn't working correctly.  Support for exporting graphs
+as SVG can be enabled by adding batik to the classpath which isn't
+included by default.
+
+It can be built on top of NetBeans 6.1 if you change the required
+modules to be platform8 instead of platform7.  The tool could run on
+JDK 1.5 with some reworking of the how the JavaScript support is
+enabled but currently it requires some tweaking of the setup.  This
+will be fixed in a later setup.
+
+The JVM support is controlled by the flag -XX:PrintIdealGraphLevel=#
+where # is:
+
+  0: no output, the default
+  1: dumps graph after parsing, before matching, and final code.
+     also dumps graph for failed compiles, if available
+  2: more detail, including after loop opts
+  3: even more detail
+  4: prints graph after parsing every bytecode (very slow)
+
+By default the JVM expects that it will connect to a visualizer on the
+local host on port 4444.  This can be configured using the options
+-XX:PrintIdealGraphAddress= and -XX:PrintIdealGraphPort=.
+PrintIdealGraphAddress can actually be a hostname.
+
+Alternatively the output can be sent to a file using
+-XX:PrintIdealGraphFile=filename.  Each compiler thread will get it's
+own file with unique names being generated by adding a number onto the
+provided file name.
+
+More information about the tool is available at
+http://wikis.sun.com/display/HotSpotInternals/IdealGraphVisualizer.
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml
new file mode 100644
index 0000000..dfdd092
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.rhino" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.rhino.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf
new file mode 100644
index 0000000..18ba3a4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.rhino

+OpenIDE-Module-Layer: com/sun/hotspot/igv/rhino/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/rhino/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml
new file mode 100644
index 0000000..d627b3a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.rhino-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties
new file mode 100644
index 0000000..e21cae5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=0c3e7912
+build.xml.script.CRC32=44d0050c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=0c3e7912
+nbproject/build-impl.xml.script.CRC32=7aab3f52
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml
new file mode 100644
index 0000000..1f9e581
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.rhino</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.rhino</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction
new file mode 100644
index 0000000..11a13a7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction
@@ -0,0 +1 @@
+com.sun.hotspot.igv.rhino.RhinoScriptEngine
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties
new file mode 100644
index 0000000..e389254
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=RhinoScriptEngineProxy
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java
new file mode 100644
index 0000000..187aa05
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.rhino;
+
+import com.sun.hotspot.igv.filter.ScriptEngineAbstraction;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RhinoScriptEngine implements ScriptEngineAbstraction {
+
+    private String jsHelperText;
+    private Constructor importer;
+    private Method scope_put;
+    private Method cx_evaluateString;
+    private Method context_enter;
+    private Method context_exit;
+
+    public boolean initialize(String s) {
+        this.jsHelperText = s;
+        Class importerTopLevel = null;
+        try {
+            ClassLoader cl = RhinoScriptEngine.class.getClassLoader();
+            Class context = cl.loadClass("org.mozilla.javascript.Context");
+            Class scriptable = cl.loadClass("org.mozilla.javascript.Scriptable");
+            importerTopLevel = cl.loadClass("org.mozilla.javascript.ImporterTopLevel");
+            importer = importerTopLevel.getDeclaredConstructor(context);
+            scope_put = importerTopLevel.getMethod("put", new Class[]{String.class, scriptable, Object.class});
+            cx_evaluateString = context.getDeclaredMethod("evaluateString", new Class[]{scriptable, String.class, String.class, Integer.TYPE, Object.class});
+            context_enter = context.getDeclaredMethod("enter", new Class[0]);
+            context_exit = context.getDeclaredMethod("exit", new Class[0]);
+            return true;
+        } catch (NoSuchMethodException nsme) {
+            return false;
+        } catch (ClassNotFoundException cnfe) {
+            return false;
+        }
+    }
+
+    public void execute(Diagram d, String code) {
+        try {
+            Object cx = context_enter.invoke(null, (Object[]) null);
+            try {
+                Object scope = importer.newInstance(cx);
+                scope_put.invoke(scope, "IO", scope, System.out);
+                scope_put.invoke(scope, "graph", scope, d);
+                cx_evaluateString.invoke(cx, scope, jsHelperText, "jsHelper.js", 1, null);
+                cx_evaluateString.invoke(cx, scope, code, "<cmd>", 1, null);
+            } finally {
+                // Exit from the context.
+                context_exit.invoke(null, (Object[]) null);
+            }
+        } catch (InvocationTargetException iae) {
+        } catch (IllegalAccessException iae) {
+        } catch (InstantiationException iae) {
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml
new file mode 100644
index 0000000..c16a8a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml
new file mode 100644
index 0000000..31a102f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.servercompilerscheduler" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.servercompilerscheduler.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf
new file mode 100644
index 0000000..20c6b68
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.servercompiler

+OpenIDE-Module-Layer: com/sun/hotspot/igv/servercompiler/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/servercompiler/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml
new file mode 100644
index 0000000..97fbd02
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.servercompilerscheduler-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties
new file mode 100644
index 0000000..18f1a88
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=d1360a65
+build.xml.script.CRC32=a9d94ef8
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=d1360a65
+nbproject/build-impl.xml.script.CRC32=52847236
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml
new file mode 100644
index 0000000..56151ed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.servercompiler</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer
new file mode 100644
index 0000000..9da82d4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer
@@ -0,0 +1 @@
+com.sun.hotspot.igv.servercompiler.JavaGroupOrganizer
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler
new file mode 100644
index 0000000..530080f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler
@@ -0,0 +1 @@
+com.sun.hotspot.igv.servercompiler.ServerCompilerScheduler

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties
new file mode 100644
index 0000000..c5daf04
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=ServerCompiler
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java
new file mode 100644
index 0000000..e9cc2d6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "Java structure";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (subFolders.size() == 0) {
+            buildResult(result, groups, packageNameProvider);
+        } else if (subFolders.size() == 1) {
+            buildResult(result, groups, classNameProvider);
+        } else if (subFolders.size() == 2) {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(reducedNameProvider.getName(g));
+                p.setRight(children);
+                result.add(p);
+            }
+        } else {
+            result.add(new Pair<String, List<Group>>("", groups));
+        }
+
+        return result;
+    }
+
+    private void buildResult(List<Pair<String, List<Group>>> result, List<Group> groups, NameProvider provider) {
+        HashMap<String, List<Group>> map = new HashMap<String, List<Group>>();
+        for (Group g : groups) {
+            String s = provider.getName(g);
+
+            if (!map.containsKey(s)) {
+                List<Group> list = new ArrayList<Group>();
+                Pair<String, List<Group>> pair = new Pair<String, List<Group>>(s, list);
+                result.add(pair);
+                map.put(s, list);
+            }
+
+            List<Group> curList = map.get(s);
+            curList.add(g);
+        }
+
+        Collections.sort(result, new Comparator<Pair<String, List<Group>>>() {
+
+            public int compare(Pair<String, List<Group>> a, Pair<String, List<Group>> b) {
+                return a.getLeft().compareTo(b.getLeft());
+            }
+        });
+    }
+
+    private static interface NameProvider {
+
+        public String getName(Group g);
+    }
+    private NameProvider reducedNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+            final String noReducedName = name;
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noReducedName;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noReducedName;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String tmp = name.substring(0, firstParenthese);
+            int lastPoint = tmp.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noReducedName;
+            }
+
+            name = name.substring(0, current + 1) + name.substring(lastPoint + 1);
+            return name;
+        }
+    };
+    private NameProvider packageNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+            final String noPackage = "<default>";
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noPackage;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noPackage;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String fullClassName = name.substring(current + 1, firstParenthese);
+            int lastPoint = fullClassName.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noPackage;
+            }
+            lastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+            if (lastPoint == -1) {
+                return noPackage;
+            }
+
+            String packageName = fullClassName.substring(0, lastPoint);
+            return packageName;
+        }
+    };
+    private NameProvider classNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+
+            final String noClass = "<noclass>";
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noClass;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noClass;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String fullClassName = name.substring(current + 1, firstParenthese);
+            int lastPoint = fullClassName.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noClass;
+            }
+            int lastlastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+
+            String className = fullClassName.substring(lastlastPoint + 1, lastPoint);
+            return className;
+        }
+    };
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java
new file mode 100644
index 0000000..408f142
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java
@@ -0,0 +1,597 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.Vector;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ServerCompilerScheduler implements Scheduler {
+
+    private static class Node {
+
+        public InputNode inputNode;
+        public Set<Node> succs = new HashSet<Node>();
+        public List<Node> preds = new ArrayList<Node>();
+        public InputBlock block;
+        public boolean isBlockProjection;
+        public boolean isBlockStart;
+    }
+    private InputGraph graph;
+    private Collection<Node> nodes;
+    private Map<InputNode, Node> inputNodeToNode;
+    private Vector<InputBlock> blocks;
+    private Map<InputBlock, InputBlock> dominatorMap;
+    private Map<InputBlock, Integer> blockIndex;
+    private InputBlock[][] commonDominator;
+    private static final Comparator<InputEdge> edgeComparator = new Comparator<InputEdge>() {
+
+        public int compare(InputEdge o1, InputEdge o2) {
+            return o1.getToIndex() - o2.getToIndex();
+        }
+    };
+
+    public void buildBlocks() {
+
+        blocks = new Vector<InputBlock>();
+        Node root = findRoot();
+        if (root == null) {
+            return;
+        }
+        Stack<Node> stack = new Stack<Node>();
+        Set<Node> visited = new HashSet<Node>();
+        stack.add(root);
+        int blockCount = 0;
+        InputBlock rootBlock = null;
+
+
+        while (!stack.isEmpty()) {
+            Node proj = stack.pop();
+            Node parent = proj;
+            if (proj.isBlockProjection && proj.preds.size() > 0) {
+                parent = proj.preds.get(0);
+            }
+
+            if (!visited.contains(parent)) {
+                visited.add(parent);
+                InputBlock block = new InputBlock(graph, "" + blockCount);
+                blocks.add(block);
+                if (parent == root) {
+                    rootBlock = block;
+                }
+                blockCount++;
+                parent.block = block;
+                if (proj != parent && proj.succs.size() == 1 && proj.succs.contains(root)) {
+                    // Special treatment of Halt-nodes
+                    proj.block = block;
+                }
+
+                Node p = proj;
+                do {
+                    if (p.preds.size() == 0 || p.preds.get(0) == null) {
+                        p = parent;
+                        break;
+                    }
+                    p = p.preds.get(0);
+
+                    if (p.block == null) {
+                        p.block = block;
+                    }
+                } while (!p.isBlockProjection && !p.isBlockStart);
+
+                if (block != rootBlock) {
+                    for (Node n : p.preds) {
+                        if (n != null && n != p) {
+                            if (n.isBlockProjection) {
+                                n = n.preds.get(0);
+                            }
+                            if (n.block != null) {
+                                n.block.addSuccessor(block);
+                            }
+                        }
+                    }
+                }
+
+                for (Node n : parent.succs) {
+                    if (n != root && n.isBlockProjection) {
+                        for (Node n2 : n.succs) {
+
+                            if (n2 != parent && n2.block != null && n2.block != rootBlock) {
+                                block.addSuccessor(n2.block);
+                            }
+                        }
+                    } else {
+                        if (n != parent && n.block != null && n.block != rootBlock) {
+                            block.addSuccessor(n.block);
+                        }
+                    }
+                }
+
+                int num_preds = p.preds.size();
+                int bottom = -1;
+                if (isRegion(p) || isPhi(p)) {
+                    bottom = 0;
+                }
+
+                int pushed = 0;
+                for (int i = num_preds - 1; i > bottom; i--) {
+                    if (p.preds.get(i) != null && p.preds.get(i) != p) {
+                        stack.push(p.preds.get(i));
+                        pushed++;
+                    }
+                }
+
+                if (pushed == 0 && p == root) {
+                // TODO: special handling when root backedges are not built yet
+                }
+            }
+        }
+
+        for (Node n : nodes) {
+            InputBlock block = n.block;
+            if (block != null) {
+                block.addNode(n.inputNode.getId());
+            }
+        }
+
+        int z = 0;
+        blockIndex = new HashMap<InputBlock, Integer>();
+        for (InputBlock b : blocks) {
+            blockIndex.put(b, z);
+            z++;
+        }
+    }
+
+    private String getBlockName(InputNode n) {
+        return n.getProperties().get("block");
+    }
+
+    public Collection<InputBlock> schedule(InputGraph graph) {
+        if (graph.getBlocks().size() > 0) {
+            Collection<InputNode> tmpNodes = new ArrayList<InputNode>(graph.getNodes());
+            for (InputNode n : tmpNodes) {
+                String block = getBlockName(n);
+                if (graph.getBlock(n) == null) {
+                    graph.getBlock(block).addNode(n);
+                    assert graph.getBlock(n) != null;
+                }
+            }
+            return graph.getBlocks();
+        } else {
+            nodes = new ArrayList<Node>();
+            inputNodeToNode = new HashMap<InputNode, Node>();
+
+            this.graph = graph;
+            buildUpGraph();
+            buildBlocks();
+            buildDominators();
+            buildCommonDominators();
+            scheduleLatest();
+
+            for (InputNode n : graph.getNodes()) {
+                assert graph.getBlock(n) != null;
+            }
+
+            return blocks;
+        }
+    }
+
+    public void scheduleLatest() {
+
+
+        Node root = findRoot();
+
+        // Mark all nodes reachable in backward traversal from root
+        Set<Node> reachable = new HashSet<Node>();
+        reachable.add(root);
+        Stack<Node> stack = new Stack<Node>();
+        stack.push(root);
+        while (!stack.isEmpty()) {
+            Node cur = stack.pop();
+            for (Node n : cur.preds) {
+                if (!reachable.contains(n)) {
+                    reachable.add(n);
+                    stack.push(n);
+                }
+            }
+        }
+
+        Set<Node> unscheduled = new HashSet<Node>();
+        for (Node n : this.nodes) {
+            if (n.block == null && reachable.contains(n)) {
+                unscheduled.add(n);
+            }
+        }
+
+        while (unscheduled.size() > 0) {
+            boolean progress = false;
+
+            Set<Node> newUnscheduled = new HashSet<Node>();
+            for (Node n : unscheduled) {
+
+                InputBlock block = null;
+                if (this.isPhi(n) && n.preds.get(0) != null) {
+                    // Phi nodes in same block as region nodes
+                    block = n.preds.get(0).block;
+                } else {
+                    for (Node s : n.succs) {
+                        if (reachable.contains(s)) {
+                            if (s.block == null) {
+                                block = null;
+                                break;
+                            } else {
+                                if (block == null) {
+                                    block = s.block;
+                                } else {
+                                    block = commonDominator[this.blockIndex.get(block)][blockIndex.get(s.block)];
+                                }
+                            }
+                        }
+                    }
+                }
+
+                if (block != null) {
+                    n.block = block;
+                    block.addNode(n.inputNode.getId());
+                    progress = true;
+                } else {
+                    newUnscheduled.add(n);
+                }
+            }
+
+            unscheduled = newUnscheduled;
+
+            if (!progress) {
+                break;
+            }
+        }
+
+        Set<Node> curReachable = new HashSet<Node>(reachable);
+        for (Node n : curReachable) {
+            if (n.block != null) {
+                for (Node s : n.succs) {
+                    if (!reachable.contains(s)) {
+                        markWithBlock(s, n.block, reachable);
+                    }
+                }
+            }
+        }
+
+    }
+
+    private void markWithBlock(Node n, InputBlock b, Set<Node> reachable) {
+        assert !reachable.contains(n);
+        Stack<Node> stack = new Stack<Node>();
+        stack.push(n);
+        n.block = b;
+        b.addNode(n.inputNode.getId());
+        reachable.add(n);
+
+        while (!stack.isEmpty()) {
+            Node cur = stack.pop();
+            for (Node s : cur.succs) {
+                if (!reachable.contains(s)) {
+                    reachable.add(s);
+                    s.block = b;
+                    b.addNode(s.inputNode.getId());
+                    stack.push(s);
+                }
+            }
+
+            for (Node s : cur.preds) {
+                if (!reachable.contains(s)) {
+                    reachable.add(s);
+                    s.block = b;
+                    b.addNode(s.inputNode.getId());
+                    stack.push(s);
+                }
+            }
+        }
+    }
+
+    private class BlockIntermediate {
+
+        InputBlock block;
+        int index;
+        int dominator;
+        int semi;
+        int parent;
+        int label;
+        int ancestor;
+        List<Integer> pred;
+        List<Integer> bucket;
+    }
+
+    public void buildCommonDominators() {
+        commonDominator = new InputBlock[this.blocks.size()][this.blocks.size()];
+        for (int i = 0; i < blocks.size(); i++) {
+            for (int j = 0; j < blocks.size(); j++) {
+                commonDominator[i][j] = getCommonDominator(i, j);
+            }
+        }
+    }
+
+    public InputBlock getCommonDominator(int a, int b) {
+        InputBlock ba = blocks.get(a);
+        InputBlock bb = blocks.get(b);
+        if (ba == bb) {
+            return ba;
+        }
+        Set<InputBlock> visited = new HashSet<InputBlock>();
+        while (ba != null) {
+            visited.add(ba);
+            ba = dominatorMap.get(ba);
+        }
+
+        while (bb != null) {
+            if (visited.contains(bb)) {
+                return bb;
+            }
+            bb = dominatorMap.get(bb);
+        }
+
+        assert false;
+        return null;
+    }
+
+    public void buildDominators() {
+        dominatorMap = new HashMap<InputBlock, InputBlock>();
+        if (blocks.size() == 0) {
+            return;
+        }
+        Vector<BlockIntermediate> intermediate = new Vector<BlockIntermediate>();
+        Map<InputBlock, BlockIntermediate> map = new HashMap<InputBlock, BlockIntermediate>();
+        int z = 0;
+        for (InputBlock b : blocks) {
+            BlockIntermediate bi = new BlockIntermediate();
+            bi.block = b;
+            bi.index = z;
+            bi.dominator = -1;
+            bi.semi = -1;
+            bi.parent = -1;
+            bi.label = z;
+            bi.ancestor = -1;
+            bi.pred = new ArrayList<Integer>();
+            bi.bucket = new ArrayList<Integer>();
+            intermediate.add(bi);
+            map.put(b, bi);
+            z++;
+        }
+        Stack<Integer> stack = new Stack<Integer>();
+        stack.add(0);
+
+        Vector<BlockIntermediate> array = new Vector<BlockIntermediate>();
+        intermediate.get(0).dominator = 0;
+
+        int n = 0;
+        while (!stack.isEmpty()) {
+            int index = stack.pop();
+            BlockIntermediate ib = intermediate.get(index);
+            ib.semi = n;
+            array.add(ib);
+            n = n + 1;
+            for (InputBlock b : ib.block.getSuccessors()) {
+                BlockIntermediate succ = map.get(b);
+                if (succ.semi == -1) {
+                    succ.parent = index;
+                    stack.push(succ.index); // TODO: check if same node could be pushed twice
+                }
+                succ.pred.add(index);
+            }
+        }
+
+        for (int i = n - 1; i > 0; i--) {
+            BlockIntermediate block = array.get(i);
+            int block_index = block.index;
+            for (int predIndex : block.pred) {
+                int curIndex = eval(predIndex, intermediate);
+                BlockIntermediate curBlock = intermediate.get(curIndex);
+                if (curBlock.semi < block.semi) {
+                    block.semi = curBlock.semi;
+                }
+            }
+
+
+            int semiIndex = block.semi;
+            BlockIntermediate semiBlock = array.get(semiIndex);
+            semiBlock.bucket.add(block_index);
+
+            link(block.parent, block_index, intermediate);
+            BlockIntermediate parentBlock = intermediate.get(block.parent);
+
+            for (int j = 0; j < parentBlock.bucket.size(); j++) {
+                for (int curIndex : parentBlock.bucket) {
+                    int newIndex = eval(curIndex, intermediate);
+                    BlockIntermediate curBlock = intermediate.get(curIndex);
+                    BlockIntermediate newBlock = intermediate.get(newIndex);
+                    int dom = block.parent;
+                    if (newBlock.semi < curBlock.semi) {
+                        dom = newIndex;
+                    }
+
+                    curBlock.dominator = dom;
+                }
+            }
+
+
+            parentBlock.bucket.clear();
+        }
+
+        for (int i = 1; i < n; i++) {
+
+            BlockIntermediate block = array.get(i);
+            int block_index = block.index;
+
+            int semi_index = block.semi;
+            BlockIntermediate semi_block = array.get(semi_index);
+
+            if (block.dominator != semi_block.index) {
+                int new_dom = intermediate.get(block.dominator).dominator;
+                block.dominator = new_dom;
+            }
+        }
+
+        for (BlockIntermediate ib : intermediate) {
+            if (ib.dominator == -1) {
+                ib.dominator = 0;
+            }
+        }
+
+        for (BlockIntermediate bi : intermediate) {
+            InputBlock b = bi.block;
+            int dominator = bi.dominator;
+            InputBlock dominatorBlock = null;
+            if (dominator != -1) {
+                dominatorBlock = intermediate.get(dominator).block;
+            }
+
+            if (dominatorBlock == b) {
+                dominatorBlock = null;
+            }
+            this.dominatorMap.put(b, dominatorBlock);
+        }
+    }
+
+    private void compress(int index, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block = blocks.get(index);
+
+        int ancestor = block.ancestor;
+        assert ancestor != -1;
+
+        BlockIntermediate ancestor_block = blocks.get(ancestor);
+        if (ancestor_block.ancestor != -1) {
+            compress(ancestor, blocks);
+
+            int label = block.label;
+            BlockIntermediate label_block = blocks.get(label);
+
+            int ancestor_label = ancestor_block.label;
+            BlockIntermediate ancestor_label_block = blocks.get(label);
+            if (ancestor_label_block.semi < label_block.semi) {
+                block.label = ancestor_label;
+            }
+
+            block.ancestor = ancestor_block.ancestor;
+        }
+    }
+
+    private int eval(int index, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block = blocks.get(index);
+        if (block.ancestor == -1) {
+            return index;
+        } else {
+            compress(index, blocks);
+            return block.label;
+        }
+    }
+
+    private void link(int index1, int index2, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block2 = blocks.get(index2);
+        block2.ancestor = index1;
+    }
+
+    private boolean isRegion(Node n) {
+        return n.inputNode.getProperties().get("name").equals("Region");
+    }
+
+    private boolean isPhi(Node n) {
+        return n.inputNode.getProperties().get("name").equals("Phi");
+    }
+
+    private Node findRoot() {
+
+        for (Node n : nodes) {
+            InputNode inputNode = n.inputNode;
+            if (inputNode.getProperties().get("name").equals("Root")) {
+                return n;
+            }
+        }
+
+        return null;
+    }
+
+    public void buildUpGraph() {
+
+        for (InputNode n : graph.getNodes()) {
+            Node node = new Node();
+            node.inputNode = n;
+            nodes.add(node);
+            String p = n.getProperties().get("is_block_proj");
+            node.isBlockProjection = (p != null && p.equals("true"));
+            p = n.getProperties().get("is_block_start");
+            node.isBlockStart = (p != null && p.equals("true"));
+            inputNodeToNode.put(n, node);
+        }
+
+        Map<Integer, List<InputEdge>> edgeMap = new HashMap<Integer, List<InputEdge>>();
+        for (InputEdge e : graph.getEdges()) {
+
+            int to = e.getTo();
+            if (!edgeMap.containsKey(to)) {
+                edgeMap.put(to, new ArrayList<InputEdge>());
+            }
+
+
+            List<InputEdge> list = edgeMap.get(to);
+            list.add(e);
+        }
+
+
+        for (Integer i : edgeMap.keySet()) {
+
+            List<InputEdge> list = edgeMap.get(i);
+            Collections.sort(list, edgeComparator);
+
+            int to = i;
+            InputNode toInputNode = graph.getNode(to);
+            Node toNode = inputNodeToNode.get(toInputNode);
+            for (InputEdge e : list) {
+                assert to == e.getTo();
+                int from = e.getFrom();
+                InputNode fromInputNode = graph.getNode(from);
+                Node fromNode = inputNodeToNode.get(fromInputNode);
+                fromNode.succs.add(toNode);
+                toNode.preds.add(fromNode);
+            }
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter
new file mode 100644
index 0000000..3ad0727
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter
@@ -0,0 +1,5 @@
+colorize("name", ".*", yellow);
+colorize("name", "Catch.*", blue);
+
+colorize("name", "Region|Loop|CountedLoop|Root", red);
+colorize("name", "CProj|IfFalse|IfTrue|JProj|CatchProj", magenta);
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter
new file mode 100644
index 0000000..8e5c5a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter
@@ -0,0 +1,4 @@
+var f = new CombineFilter("Combine Filter");
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", ".*"), new Properties.RegexpPropertyMatcher("name", "Proj|IfFalse|IfTrue|JProj|MachProj|JumpProj|CatchProj")));
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", "Cmp.*"), new Properties.RegexpPropertyMatcher("name", "Bool")));
+f.apply(graph);
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter
new file mode 100644
index 0000000..5327737
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter
@@ -0,0 +1,4 @@
+colorize("state", "same", white);
+colorize("state", "changed", orange);
+colorize("state", "new", green);
+colorize("state", "deleted", red);
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter
new file mode 100644
index 0000000..1ea0fb3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter
@@ -0,0 +1,3 @@
+colorize("name", "Con.*", orange);
+colorize("name", "Parm|Proj", lightGray);
+colorize("bci", "..*", magenta);
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter
new file mode 100644
index 0000000..9aa15e7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter
@@ -0,0 +1,7 @@
+var f = new ColorFilter("Line Style filter");
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "int:")), null, Color.BLUE, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "control")), null, Color.RED, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory")), null, Color.GREEN, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "tuple:")), null, Color.MAGENTA, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "bottom")), null, Color.LIGHT_GRAY, null));
+f.apply(graph);
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter
new file mode 100644
index 0000000..0f18448
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter
@@ -0,0 +1,3 @@
+colorize("is_dontcare", "false", white);
+colorize("is_shared", "true", green);
+colorize("is_dontcare", "true", red);
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter
new file mode 100644
index 0000000..7230576
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter
@@ -0,0 +1,24 @@
+var f = new RemoveFilter("Show only control flow");
+f.addRule(
+  new RemoveFilter.RemoveRule(
+    new InvertSelector(
+      new OrSelector(
+        new OrSelector(
+          new SuccessorSelector(
+            new MatcherSelector(
+              new Properties.StringPropertyMatcher("type", "control")
+            )
+          ),
+	  new MatcherSelector(
+            new Properties.StringPropertyMatcher("type", "control")
+          )
+        ),
+	new MatcherSelector(
+          new Properties.StringPropertyMatcher("name", "Start")
+        )
+      )
+    ), false
+  )
+);
+f.addRule( new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher("name", "Phi|Store.")), false));
+f.apply(graph);
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter
new file mode 100644
index 0000000..5328246
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter
@@ -0,0 +1,4 @@
+colorize("reg", "EAX", green);
+colorize("reg", "EFLAGS", gray);
+colorize("reg", "EBP", orange);
+colorize("reg", "ECX", cyan);
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter
new file mode 100644
index 0000000..0333fcc
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter
@@ -0,0 +1 @@
+remove("dump_spec", "FramePtr|ReturnAdr|I_O"); 
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter
new file mode 100644
index 0000000..842caed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter
@@ -0,0 +1,7 @@
+
+//var f = new RemoveFilter("Remove Memory");
+//f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.StringPropertyMatcher("dump_spec", "Memory")), false));
+//f.addRule(new RemoveFilter.RemoveRule(new AndSelector(new MatcherSelector(new Properties.StringPropertyMatcher("name", "Proj")), new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory"))), false));
+//f.apply(graph);
+
+remove("dump_spec", "Memory");
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter
new file mode 100644
index 0000000..8f6aacd
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter
@@ -0,0 +1 @@
+removeInputs("name", "Root");
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter
new file mode 100644
index 0000000..b2abf0e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter
@@ -0,0 +1,4 @@
+removeInputs("name", "SafePoint|CallStaticJava|CallDynamicJava|CallJava|CallLeaf|CallRuntime|AbstractLock|CallLeafNoFP|Call|CallStaticJavaDirect", 5);
+removeInputs("name", "Unlock|Lock", 7);
+removeInputs("name", "Allocate", 7);
+removeInputs("name", "AllocateArray", 9);
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter
new file mode 100644
index 0000000..debfd59
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter
@@ -0,0 +1,2 @@
+var f = new RemoveSelfLoopsFilter("Remove Self-Loops");
+f.apply(graph);
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter
new file mode 100644
index 0000000..5f344ca
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter
@@ -0,0 +1,2 @@
+split("name", "BoxLock");
+split("name", "(Con.*)|(loadCon.*)");
\ No newline at end of file
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml
new file mode 100644
index 0000000..461692d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+      <folder name="Filters">
+        <file name="Basic Coloring" url="filters/color.filter">
+            <attr name="enabled" boolvalue="true"/>
+        </file>
+        <file name="Matcher Flags Coloring" url="filters/matchingFlags.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Basic Coloring"/>
+        </file>
+        <file name="Register Coloring" url="filters/register.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Matcher Flags Coloring"/>
+        </file>
+        <file name="Extended Coloring" url="filters/extendedColor.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Register Coloring"/>
+        </file>
+        <file name="Line Coloring" url="filters/linestyle.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Extended Coloring"/>
+        </file>
+        <file name="Difference Coloring" url="filters/difference.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Line Coloring"/>
+        </file>
+        <file name="Only Control Flow" url="filters/onlyControlFlow.filter">
+            <attr name="enabled" boolvalue="false"/>
+            <attr name="after" stringvalue="Difference Coloring"/>
+        </file>
+        <file name="Remove FramePtr, I_O and Return Address" url="filters/remove.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Only Control Flow"/>
+        </file>
+        <file name="Remove Memory" url="filters/removeMemory.filter">
+            <attr name="enabled" boolvalue="false"/>
+            <attr name="after" stringvalue="Remove FramePtr, I_O and Return Address"/>
+        </file>
+        <file name="Remove Root Inputs" url="filters/removeRootInputs.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Memory"/>
+        </file>
+        <file name="Remove Safepoint Inputs" url="filters/removeSafepointInputs.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Root Inputs"/>
+        </file>
+        <file name="Remove Self Loops" url="filters/removeSelfLoops.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Safepoint Inputs"/>
+        </file>
+        <file name="Combine" url="filters/combine.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Self Loops"/>
+        </file>
+        <file name="Split" url="filters/split.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Combine"/>
+        </file>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml
new file mode 100644
index 0000000..7ba84f5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.settings" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.settings.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf
new file mode 100644
index 0000000..15f55c9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.settings

+OpenIDE-Module-Layer: com/sun/hotspot/igv/settings/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/settings/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml
new file mode 100644
index 0000000..ca15154
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.settings-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties
new file mode 100644
index 0000000..d727111
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=8869440a
+build.xml.script.CRC32=7ef09117
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=8869440a
+nbproject/build-impl.xml.script.CRC32=1a0e7f21
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml
new file mode 100644
index 0000000..0748a12
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.options.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.5</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.settings</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties
new file mode 100644
index 0000000..2c701a0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties
@@ -0,0 +1,5 @@
+AdvancedOption_DisplayName_Settings=Settings
+AdvancedOption_Tooltip_Settings=Application Settings
+OpenIDE-Module-Name=Settings
+OptionsCategory_Name_View=General
+OptionsCategory_Title_View=View Settings
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java
new file mode 100644
index 0000000..af7627c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.settings;
+
+import java.util.prefs.Preferences;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Settings {
+
+    public final static String NODE_TEXT = "nodeText";
+    public final static String NODE_TEXT_DEFAULT = "[idx] [name]";
+    public final static String NODE_WIDTH = "nodeWidth";
+    public final static String NODE_WIDTH_DEFAULT = "100";
+    public final static String PORT = "port";
+    public final static String PORT_DEFAULT = "4444";
+    public final static String DIRECTORY = "directory";
+    public final static String DIRECTORY_DEFAULT = System.getProperty("user.dir");
+
+    public static Preferences get() {
+        return Preferences.userNodeForPackage(Settings.class);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java
new file mode 100644
index 0000000..857f87e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import org.netbeans.spi.options.OptionsCategory;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ViewOptionsCategory extends OptionsCategory {
+
+    @Override
+    public Icon getIcon() {
+        return new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/settings/settings.gif"));
+    }
+
+    public String getCategoryName() {
+        return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Name_View");
+    }
+
+    public String getTitle() {
+        return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Title_View");
+    }
+
+    public OptionsPanelController create() {
+        return new ViewOptionsPanelController();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java
new file mode 100644
index 0000000..0e6c09a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewOptionsPanelController extends OptionsPanelController {
+
+    private ViewPanel panel;
+    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+    private boolean changed;
+
+    public void update() {
+        getPanel().load();
+        changed = false;
+    }
+
+    public void applyChanges() {
+        getPanel().store();
+        changed = false;
+    }
+
+    public void cancel() {
+    // need not do anything special, if no changes have been persisted yet
+    }
+
+    public boolean isValid() {
+        return getPanel().valid();
+    }
+
+    public boolean isChanged() {
+        return changed;
+    }
+
+    public HelpCtx getHelpCtx() {
+        return null; // new HelpCtx("...ID") if you have a help set
+    }
+
+    public JComponent getComponent(Lookup masterLookup) {
+        return getPanel();
+    }
+
+    public void addPropertyChangeListener(PropertyChangeListener l) {
+        pcs.addPropertyChangeListener(l);
+    }
+
+    public void removePropertyChangeListener(PropertyChangeListener l) {
+        pcs.removePropertyChangeListener(l);
+    }
+
+    private ViewPanel getPanel() {
+        if (panel == null) {
+            panel = new ViewPanel(this);
+        }
+        return panel;
+    }
+
+    void changed() {
+        if (!changed) {
+            changed = true;
+            pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+        }
+        pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form
new file mode 100644
index 0000000..9b3fc1e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="206" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="39" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="portSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+                      <Component id="nodeWidthSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+                      <Component id="jScrollPane1" alignment="0" min="-2" pref="365" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="nodeWidthSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="portSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="73" max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Node Text"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Node Width"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JSpinner" name="portSpinner">
+        </Component>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTextArea" name="nodeTextArea">
+              <Properties>
+                <Property name="columns" type="int" value="20"/>
+                <Property name="rows" type="int" value="5"/>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Component class="javax.swing.JSpinner" name="nodeWidthSpinner">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Network Port"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java
new file mode 100644
index 0000000..b02644a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewPanel extends javax.swing.JPanel {
+
+    private final ViewOptionsPanelController controller;
+
+    ViewPanel(ViewOptionsPanelController controller) {
+        this.controller = controller;
+        initComponents();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        portSpinner = new javax.swing.JSpinner();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        nodeTextArea = new javax.swing.JTextArea();
+        nodeWidthSpinner = new javax.swing.JSpinner();
+        jLabel3 = new javax.swing.JLabel();
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, "Node Text");
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, "Node Width");
+
+        nodeTextArea.setColumns(20);
+        nodeTextArea.setRows(5);
+        jScrollPane1.setViewportView(nodeTextArea);
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, "Network Port");
+
+        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(jLabel1)
+                    .add(jLabel3)
+                    .add(jLabel2))
+                .add(39, 39, 39)
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                    .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 365, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap())
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(jPanel1Layout.createSequentialGroup()
+                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                        .add(18, 18, 18)
+                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                            .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                            .add(jLabel2))
+                        .add(18, 18, 18)
+                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                            .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                            .add(jLabel3)))
+                    .add(jLabel1))
+                .add(73, 73, 73))
+        );
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 232, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(206, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    void load() {
+        nodeTextArea.setText(Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+        nodeWidthSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.NODE_WIDTH, Settings.NODE_WIDTH_DEFAULT)));
+        portSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT)));
+    }
+
+    void store() {
+        Settings.get().put(Settings.NODE_TEXT, nodeTextArea.getText());
+        Settings.get().put(Settings.NODE_WIDTH, nodeWidthSpinner.getValue().toString());
+        Settings.get().put(Settings.PORT, portSpinner.getValue().toString());
+    }
+
+    boolean valid() {
+        return true;
+    }
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JTextArea nodeTextArea;
+    private javax.swing.JSpinner nodeWidthSpinner;
+    private javax.swing.JSpinner portSpinner;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml
new file mode 100644
index 0000000..f7a7aba
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="OptionsDialog">
+        <file name="Advanced.instance_hidden"/>
+        <file name="General.instance_hidden"/>
+        <file name="com-sun-hotspot-igv-settings-ViewOptionsCategory.instance"/>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif
new file mode 100644
index 0000000..030be82
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml
new file mode 100644
index 0000000..1af1e36
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.util" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.util.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf
new file mode 100644
index 0000000..9c10b50
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.util

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/util/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml
new file mode 100644
index 0000000..8a444c3
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.util-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties
new file mode 100644
index 0000000..494d2b8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a470a16f
+build.xml.script.CRC32=466cf03b
+build.xml.stylesheet.CRC32=05353c81
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a470a16f
+nbproject/build-impl.xml.script.CRC32=39f45e01
+nbproject/build-impl.xml.stylesheet.CRC32=3f8b4615
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml
new file mode 100644
index 0000000..3ae7755
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.util</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java
new file mode 100644
index 0000000..f79113f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+    private double minFactor = 0.0;
+    private double maxFactor = Double.MAX_VALUE;
+    private double zoomMultiplier;
+    private boolean useAnimator;
+
+    public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+        this.zoomMultiplier = zoomMultiplier;
+        this.useAnimator = useAnimator;
+    }
+
+    public double getMinFactor() {
+        return minFactor;
+    }
+
+    public void setMinFactor(double d) {
+        minFactor = d;
+    }
+
+    public double getMaxFactor() {
+        return maxFactor;
+    }
+
+    public void setMaxFactor(double d) {
+        maxFactor = d;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+        final Scene scene = widget.getScene();
+        int amount = event.getWheelRotation();
+        JScrollPane scrollPane = findScrollPane(scene.getView());
+        Point viewPosition = null;
+        Point mouseLocation = scene.convertSceneToView(event.getPoint());
+        int xOffset = 0;
+        int yOffset = 0;
+        Point oldViewPosition = null;
+        Rectangle bounds = new Rectangle(scene.getBounds());
+        Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+
+        if (scrollPane != null) {
+            viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+            oldViewPosition = new Point(viewPosition);
+            xOffset = (mouseLocation.x - viewPosition.x);
+            yOffset = (mouseLocation.y - viewPosition.y);
+            viewPosition.x += xOffset;
+            viewPosition.y += yOffset;
+        }
+
+        if (useAnimator) {
+            SceneAnimator sceneAnimator = scene.getSceneAnimator();
+            synchronized (sceneAnimator) {
+                double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+                while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+                    zoom /= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x /= zoomMultiplier;
+                        viewPosition.y /= zoomMultiplier;
+                        bounds.width /= zoomMultiplier;
+                        bounds.height /= zoomMultiplier;
+                        componentSize.width /= zoomMultiplier;
+                        componentSize.height /= zoomMultiplier;
+                    }
+                    amount--;
+                }
+                while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+                    zoom *= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x *= zoomMultiplier;
+                        viewPosition.y *= zoomMultiplier;
+                        bounds.width *= zoomMultiplier;
+                        bounds.height *= zoomMultiplier;
+                        componentSize.width *= zoomMultiplier;
+                        componentSize.height *= zoomMultiplier;
+                    }
+                    amount++;
+                }
+                sceneAnimator.animateZoomFactor(zoom);
+            }
+        } else {
+            double zoom = scene.getZoomFactor();
+            while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+                zoom /= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x /= zoomMultiplier;
+                    viewPosition.y /= zoomMultiplier;
+                    bounds.width /= zoomMultiplier;
+                    bounds.height /= zoomMultiplier;
+                    componentSize.width /= zoomMultiplier;
+                    componentSize.height /= zoomMultiplier;
+                }
+                amount--;
+            }
+            while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+                zoom *= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x *= zoomMultiplier;
+                    viewPosition.y *= zoomMultiplier;
+                    bounds.width *= zoomMultiplier;
+                    bounds.height *= zoomMultiplier;
+                    componentSize.width *= zoomMultiplier;
+                    componentSize.height *= zoomMultiplier;
+                }
+                amount++;
+            }
+            scene.setZoomFactor(zoom);
+        }
+
+        if (scrollPane != null) {
+            scene.validate(); // Call validate to update size of scene
+            Dimension size = scrollPane.getViewport().getExtentSize();
+            viewPosition.x -= xOffset;
+            viewPosition.y -= yOffset;
+            scene.resolveBounds(scene.getLocation(), bounds);
+            scene.getView().setPreferredSize(componentSize);
+            scene.getView().revalidate();
+            scene.getView().addNotify();
+            scrollPane.getViewport().setViewPosition(viewPosition);
+        }
+
+        return WidgetAction.State.CONSUMED;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties
new file mode 100644
index 0000000..ad93aff
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties
@@ -0,0 +1 @@
+OpenIDE-Module-Name=Util
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java
new file mode 100644
index 0000000..2c0c2ff
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import javax.swing.Icon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorIcon implements Icon {
+
+    private Color color;
+
+    public ColorIcon(Color c) {
+        color = c;
+    }
+
+    public void paintIcon(Component c, Graphics g, int x, int y) {
+        g.setColor(color);
+        g.fillRect(x, y, 16, 16);
+    }
+
+    public int getIconWidth() {
+        return 16;
+    }
+
+    public int getIconHeight() {
+        return 16;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java
new file mode 100644
index 0000000..cc82017
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.EventQueue;
+import org.openide.util.ContextAwareAction;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class ContextAction<T> extends CallableSystemAction implements LookupListener, ContextAwareAction {
+
+    private Lookup context = null;
+    private Lookup.Result<T> result = null;
+
+    public ContextAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public ContextAction(Lookup context) {
+        init(context);
+    }
+
+    private void init(Lookup context) {
+        this.context = context;
+        result = context.lookupResult(contextClass());
+        result.addLookupListener(this);
+        resultChanged(null);
+    }
+
+    public void resultChanged(LookupEvent e) {
+        if (result.allItems().size() != 0) {
+            update(result.allInstances().iterator().next());
+        } else {
+            update(null);
+        }
+    }
+
+    @Override
+    public void performAction() {
+        final T t = result.allInstances().iterator().next();
+
+        // Ensure it's AWT event thread
+        EventQueue.invokeLater(new Runnable() {
+
+            public void run() {
+                performAction(t);
+            }
+        });
+    }
+
+    public void update(T t) {
+        if (t == null) {
+            setEnabled(false);
+        } else {
+            setEnabled(isEnabled(t));
+        }
+    }
+
+    public boolean isEnabled(T context) {
+        return true;
+    }
+
+    public abstract Class<T> contextClass();
+
+    public abstract void performAction(T context);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java
new file mode 100644
index 0000000..e01f8c8
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DoubleClickAction extends WidgetAction.Adapter {
+
+    private DoubleClickHandler handler;
+
+    public DoubleClickAction(DoubleClickHandler handler) {
+        this.handler = handler;
+    }
+
+    @Override
+    public WidgetAction.State mouseClicked(Widget widget, WidgetAction.WidgetMouseEvent event) {
+        if (event.getClickCount() > 1) {
+            handler.handleDoubleClick(widget, event);
+            return WidgetAction.State.CONSUMED;
+        }
+        return WidgetAction.State.REJECTED;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java
new file mode 100644
index 0000000..61ccaed
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface DoubleClickHandler {
+
+    public void handleDoubleClick(Widget w, WidgetMouseEvent e);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java
new file mode 100644
index 0000000..81cf5c7
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+    private Scene scene;
+    private Image image;
+    private int imageWidth;
+    private int imageHeight;
+
+    public ExtendedSatelliteComponent(Scene scene) {
+        this.scene = scene;
+        setDoubleBuffered(true);
+        setPreferredSize(new Dimension(128, 128));
+        addMouseListener(this);
+        addMouseMotionListener(this);
+    }
+
+    @Override
+    public void addNotify() {
+        super.addNotify();
+        scene.addSceneListener(this);
+        JComponent viewComponent = scene.getView();
+        if (viewComponent == null) {
+            viewComponent = scene.createView();
+        }
+        viewComponent.addComponentListener(this);
+        repaint();
+    }
+
+    @Override
+    public void removeNotify() {
+        scene.getView().removeComponentListener(this);
+        scene.removeSceneListener(this);
+        super.removeNotify();
+    }
+
+    public void update() {
+        this.image = null;
+        repaint();
+    }
+
+    @Override
+    public void paint(Graphics g) {
+        Graphics2D gr = (Graphics2D) g;
+        super.paint(g);
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+
+        if (image == null || vw != imageWidth || vh != imageHeight) {
+
+            imageWidth = vw;
+            imageHeight = vh;
+            image = this.createImage(imageWidth, imageHeight);
+            Graphics2D ig = (Graphics2D) image.getGraphics();
+            ig.scale(scale, scale);
+            scene.paint(ig);
+        }
+
+        gr.drawImage(image, vx, vy, this);
+
+        JComponent component = scene.getView();
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+        if (viewRectangle != null) {
+            Rectangle window = new Rectangle(
+                    (int) ((double) viewRectangle.x * scale / zoomFactor),
+                    (int) ((double) viewRectangle.y * scale / zoomFactor),
+                    (int) ((double) viewRectangle.width * scale / zoomFactor),
+                    (int) ((double) viewRectangle.height * scale / zoomFactor));
+            window.translate(vx, vy);
+            gr.setColor(new Color(200, 200, 200, 128));
+            gr.fill(window);
+            gr.setColor(Color.BLACK);
+            gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+        }
+    }
+
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    public void mousePressed(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseMoved(MouseEvent e) {
+    }
+
+    private void moveVisibleRect(Point center) {
+        JComponent component = scene.getView();
+        if (component == null) {
+            return;
+        }
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+        int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+        int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+        Rectangle visibleRect = component.getVisibleRect();
+        visibleRect.x = cx - visibleRect.width / 2;
+        visibleRect.y = cy - visibleRect.height / 2;
+        component.scrollRectToVisible(visibleRect);
+
+    }
+
+    public void sceneRepaint() {
+    }
+
+    public void sceneValidating() {
+    }
+
+    public void sceneValidated() {
+    }
+
+    public void componentResized(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentMoved(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentShown(ComponentEvent e) {
+    }
+
+    public void componentHidden(ComponentEvent e) {
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java
new file mode 100644
index 0000000..7501c14
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JPanel;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetKeyEvent;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSelectAction extends WidgetAction.Adapter {
+
+    private WidgetAction innerAction;
+    private JPanel panel;
+
+    public ExtendedSelectAction(SelectProvider provider) {
+        innerAction = ActionFactory.createSelectAction(provider);
+        panel = new JPanel();
+    }
+
+    @Override
+    public State mousePressed(Widget widget, WidgetMouseEvent event) {
+        // TODO: Solve this differently?
+        if (event.getButton() != MouseEvent.BUTTON2) {
+            return innerAction.mousePressed(widget, new WidgetMouseEvent(event.getEventID(), new MouseEvent(panel, (int) event.getEventID(), event.getWhen(), event.getModifiersEx(), event.getPoint().x, event.getPoint().y, event.getClickCount(), event.isPopupTrigger(), MouseEvent.BUTTON1)));
+        } else {
+            return super.mousePressed(widget, event);
+        }
+    }
+
+    @Override
+    public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+        return innerAction.mouseReleased(widget, event);
+    }
+
+    @Override
+    public State keyTyped(Widget widget, WidgetKeyEvent event) {
+        return innerAction.keyTyped(widget, event);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java
new file mode 100644
index 0000000..f058edd
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.lang.reflect.InvocationTargetException;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PropertiesSheet {
+
+    public static void initializeSheet(Properties properties, Sheet s) {
+
+        Sheet.Set set1 = Sheet.createPropertiesSet();
+        set1.setDisplayName("Properties");
+        for (final Property p : properties.getProperties()) {
+            Node.Property<String> prop = new Node.Property<String>(String.class) {
+
+                @Override
+                public boolean canRead() {
+                    return true;
+                }
+
+                @Override
+                public String getValue() throws IllegalAccessException, InvocationTargetException {
+                    return p.getValue();
+                }
+
+                @Override
+                public boolean canWrite() {
+                    return false;
+                }
+
+                @Override
+                public void setValue(String arg0) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+                    p.setValue(arg0);
+                }
+            };
+            prop.setName(p.getName());
+            set1.put(prop);
+        }
+        s.put(set1);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java
new file mode 100644
index 0000000..c5f3100
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java
@@ -0,0 +1,360 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.List;
+import javax.swing.JComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSlider extends JComponent implements ChangedListener<RangeSliderModel>, MouseListener, MouseMotionListener {
+
+    public static final int HEIGHT = 40;
+    public static final int BAR_HEIGHT = 22;
+    public static final int BAR_SELECTION_ENDING_HEIGHT = 16;
+    public static final int BAR_SELECTION_HEIGHT = 10;
+    public static final int BAR_THICKNESS = 2;
+    public static final int BAR_CIRCLE_SIZE = 9;
+    public static final int MOUSE_ENDING_OFFSET = 3;
+    public static final Color BACKGROUND_COLOR = Color.white;
+    public static final Color BAR_COLOR = Color.black;
+    public static final Color BAR_SELECTION_COLOR = new Color(255, 0, 0, 120);
+    public static final Color BAR_SELECTION_COLOR_ROLLOVER = new Color(255, 0, 255, 120);
+    public static final Color BAR_SELECTION_COLOR_DRAG = new Color(0, 0, 255, 120);
+    private RangeSliderModel model;
+    private State state;
+    private Point startPoint;
+    private RangeSliderModel tempModel;
+    private boolean isOverBar;
+
+    private enum State {
+
+        Initial,
+        DragBar,
+        DragFirstPosition,
+        DragSecondPosition
+    }
+
+    public RangeSlider() {
+        state = State.Initial;
+        this.addMouseMotionListener(this);
+        this.addMouseListener(this);
+    }
+
+    public void setModel(RangeSliderModel newModel) {
+        if (model != null) {
+            model.getChangedEvent().removeListener(this);
+            model.getColorChangedEvent().removeListener(this);
+        }
+        if (newModel != null) {
+            newModel.getChangedEvent().addListener(this);
+            newModel.getColorChangedEvent().addListener(this);
+        }
+        this.model = newModel;
+        update();
+    }
+
+    private RangeSliderModel getPaintingModel() {
+        if (tempModel != null) {
+            return tempModel;
+        }
+        return model;
+    }
+
+    @Override
+    public Dimension getPreferredSize() {
+        Dimension d = super.getPreferredSize();
+        d.height = HEIGHT;
+        return d;
+    }
+
+    public void changed(RangeSliderModel source) {
+        update();
+    }
+
+    private void update() {
+        this.repaint();
+    }
+
+    private int getXPosition(int index) {
+        assert index >= 0 && index < getPaintingModel().getPositions().size();
+        return getXOffset() * (index + 1);
+    }
+
+    private int getXOffset() {
+        int size = getPaintingModel().getPositions().size();
+        int width = getWidth();
+        return (width / (size + 1));
+    }
+
+    private int getEndXPosition(int index) {
+        return getXPosition(index) + getXOffset() / 2;
+    }
+
+    private int getStartXPosition(int index) {
+        return getXPosition(index) - getXOffset() / 2;
+    }
+
+    @Override
+    public void paint(Graphics g) {
+        super.paint(g);
+        Graphics2D g2 = (Graphics2D) g;
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                RenderingHints.VALUE_ANTIALIAS_ON);
+        int width = getWidth();
+        int height = getHeight();
+
+        g2.setColor(BACKGROUND_COLOR);
+        g2.fillRect(0, 0, width, height);
+
+        // Nothing to paint?
+        if (getPaintingModel() == null || getPaintingModel().getPositions().size() == 0) {
+            return;
+        }
+
+        int firstPos = getPaintingModel().getFirstPosition();
+        int secondPos = getPaintingModel().getSecondPosition();
+
+        paintSelected(g2, firstPos, secondPos);
+        paintBar(g2);
+
+    }
+
+    private int getBarStartY() {
+        return getHeight() - BAR_HEIGHT;
+    }
+
+    private void paintBar(Graphics2D g) {
+        List<String> list = getPaintingModel().getPositions();
+        int barStartY = getBarStartY();
+
+        g.setColor(BAR_COLOR);
+        g.fillRect(getXPosition(0), barStartY + BAR_HEIGHT / 2 - BAR_THICKNESS / 2, getXPosition(list.size() - 1) - getXPosition(0), BAR_THICKNESS);
+
+        int circleCenterY = barStartY + BAR_HEIGHT / 2;
+        for (int i = 0; i < list.size(); i++) {
+            int curX = getXPosition(i);
+            g.setColor(getPaintingModel().getColors().get(i));
+            g.fillOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+            g.setColor(Color.black);
+            g.drawOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+
+
+            String curS = list.get(i);
+            if (curS != null && curS.length() > 0) {
+                int startX = getStartXPosition(i);
+                int endX = getEndXPosition(i);
+                FontMetrics metrics = g.getFontMetrics();
+                Rectangle bounds = metrics.getStringBounds(curS, g).getBounds();
+                if (bounds.width < endX - startX && bounds.height < barStartY) {
+                    g.setColor(Color.black);
+                    g.drawString(curS, startX + (endX - startX) / 2 - bounds.width / 2, barStartY / 2 + bounds.height / 2);
+                }
+            }
+        }
+
+    }
+
+    private void paintSelected(Graphics2D g, int start, int end) {
+
+        int startX = getStartXPosition(start);
+        int endX = getEndXPosition(end);
+        int barStartY = getBarStartY();
+        int barSelectionEndingStartY = barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_ENDING_HEIGHT / 2;
+        paintSelectedEnding(g, startX, barSelectionEndingStartY);
+        paintSelectedEnding(g, endX, barSelectionEndingStartY);
+
+        g.setColor(BAR_SELECTION_COLOR);
+        if (state == State.DragBar) {
+            g.setColor(BAR_SELECTION_COLOR_DRAG);
+        } else if (isOverBar) {
+            g.setColor(BAR_SELECTION_COLOR_ROLLOVER);
+        }
+        g.fillRect(startX, barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_HEIGHT / 2, endX - startX, BAR_SELECTION_HEIGHT);
+    }
+
+    private void paintSelectedEnding(Graphics g, int x, int y) {
+        g.setColor(BAR_COLOR);
+        g.fillRect(x - BAR_THICKNESS / 2, y, BAR_THICKNESS, BAR_SELECTION_ENDING_HEIGHT);
+    }
+
+    private boolean isOverSecondPosition(Point p) {
+        if (p.y >= getBarStartY()) {
+            int destX = getEndXPosition(getPaintingModel().getSecondPosition());
+            int off = Math.abs(destX - p.x);
+            return off <= MOUSE_ENDING_OFFSET;
+        }
+        return false;
+    }
+
+    private boolean isOverFirstPosition(Point p) {
+        if (p.y >= getBarStartY()) {
+            int destX = getStartXPosition(getPaintingModel().getFirstPosition());
+            int off = Math.abs(destX - p.x);
+            return off <= MOUSE_ENDING_OFFSET;
+        }
+        return false;
+    }
+
+    private boolean isOverSelection(Point p) {
+        if (p.y >= getBarStartY() && !isOverFirstPosition(p) && !isOverSecondPosition(p)) {
+            return p.x > getStartXPosition(getPaintingModel().getFirstPosition()) && p.x < getEndXPosition(getPaintingModel().getSecondPosition());
+        }
+        return false;
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        if (state == State.DragBar) {
+            int firstX = this.getStartXPosition(model.getFirstPosition());
+            int newFirstX = firstX + e.getPoint().x - startPoint.x;
+            int newIndex = getIndexFromPosition(newFirstX) + 1;
+            if (newIndex + model.getSecondPosition() - model.getFirstPosition() >= model.getPositions().size()) {
+                newIndex = model.getPositions().size() - (model.getSecondPosition() - model.getFirstPosition()) - 1;
+            }
+            int secondPosition = newIndex + model.getSecondPosition() - model.getFirstPosition();
+            tempModel.setPositions(newIndex, secondPosition);
+            update();
+        } else if (state == State.DragFirstPosition) {
+            int firstPosition = getIndexFromPosition(e.getPoint().x) + 1;
+            int secondPosition = model.getSecondPosition();
+            if (firstPosition > secondPosition) {
+                firstPosition--;
+            }
+            tempModel.setPositions(firstPosition, secondPosition);
+            update();
+        } else if (state == State.DragSecondPosition) {
+            int firstPosition = model.getFirstPosition();
+            int secondPosition = getIndexFromPosition(e.getPoint().x);
+            if (secondPosition < firstPosition) {
+                secondPosition++;
+            }
+            tempModel.setPositions(firstPosition, secondPosition);
+            update();
+        }
+    }
+
+    private int getIndexFromPosition(int x) {
+        if (x < getXPosition(0)) {
+            return -1;
+        }
+        for (int i = 0; i < getPaintingModel().getPositions().size() - 1; i++) {
+            int startX = getXPosition(i);
+            int endX = getXPosition(i + 1);
+            if (x >= startX && x <= endX) {
+                return i;
+            }
+        }
+        return getPaintingModel().getPositions().size() - 1;
+    }
+
+    private int getCircleIndexFromPosition(int x) {
+        int result = 0;
+        for (int i = 1; i < getPaintingModel().getPositions().size() - 1; i++) {
+            if (x > getStartXPosition(i)) {
+                result = i;
+            }
+        }
+        return result;
+    }
+
+    public void mouseMoved(MouseEvent e) {
+        isOverBar = false;
+        if (model == null) {
+            return;
+        }
+
+
+        Point p = e.getPoint();
+        if (isOverFirstPosition(p) || isOverSecondPosition(p)) {
+            setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
+        } else if (isOverSelection(p)) {
+            isOverBar = true;
+            setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        } else {
+            this.setCursor(Cursor.getDefaultCursor());
+        }
+        repaint();
+    }
+
+    public void mouseClicked(MouseEvent e) {
+        if (e.getClickCount() > 1) {
+            // Double click
+            int index = getCircleIndexFromPosition(e.getPoint().x);
+            model.setPositions(index, index);
+        }
+    }
+
+    public void mousePressed(MouseEvent e) {
+        if (model == null) {
+            return;
+        }
+
+        Point p = e.getPoint();
+        if (isOverFirstPosition(p)) {
+            state = State.DragFirstPosition;
+        } else if (isOverSecondPosition(p)) {
+            state = State.DragSecondPosition;
+        } else if (isOverSelection(p)) {
+            state = State.DragBar;
+        } else {
+            return;
+        }
+
+        startPoint = e.getPoint();
+        tempModel = model.copy();
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        if (model == null || tempModel == null) {
+            return;
+        }
+        state = State.Initial;
+        model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition());
+        tempModel = null;
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+        isOverBar = false;
+        repaint();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java
new file mode 100644
index 0000000..71766ec
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSliderModel implements ChangedEventProvider<RangeSliderModel> {
+
+    // Warning: Update setData method if fields are added
+    private ChangedEvent<RangeSliderModel> changedEvent;
+    private ChangedEvent<RangeSliderModel> colorChangedEvent;
+    private List<String> positions;
+    private int firstPosition;
+    private int secondPosition;
+    private List<Color> colors;
+
+    public void setData(RangeSliderModel model) {
+        boolean changed = false;
+        changed |= (positions != model.positions);
+        positions = model.positions;
+        changed |= (firstPosition != model.firstPosition);
+        firstPosition = model.firstPosition;
+        changed |= (secondPosition != model.secondPosition);
+        secondPosition = model.secondPosition;
+        boolean colorChanged = (colors != model.colors);
+        colors = model.colors;
+        if (changed) {
+            changedEvent.fire();
+        }
+        if (colorChanged) {
+            colorChangedEvent.fire();
+        }
+    }
+
+    public RangeSliderModel(List<String> positions) {
+        assert positions.size() > 0;
+        this.positions = positions;
+        this.changedEvent = new ChangedEvent<RangeSliderModel>(this);
+        this.colorChangedEvent = new ChangedEvent<RangeSliderModel>(this);
+        colors = new ArrayList<Color>();
+        for (int i = 0; i < positions.size(); i++) {
+            colors.add(Color.black);
+        }
+    }
+
+    public void setColors(List<Color> colors) {
+        this.colors = colors;
+        colorChangedEvent.fire();
+    }
+
+    public List<Color> getColors() {
+        return colors;
+    }
+
+    public RangeSliderModel copy() {
+        RangeSliderModel newModel = new RangeSliderModel(positions);
+        newModel.firstPosition = firstPosition;
+        newModel.secondPosition = secondPosition;
+        newModel.colors = colors;
+        return newModel;
+    }
+
+    public List<String> getPositions() {
+        return Collections.unmodifiableList(positions);
+    }
+
+    public int getFirstPosition() {
+        return firstPosition;
+    }
+
+    public int getSecondPosition() {
+        return secondPosition;
+    }
+
+    public void setPositions(int fp, int sp) {
+        assert fp >= 0 && fp < positions.size();
+        assert sp >= 0 && sp < positions.size();
+        firstPosition = fp;
+        secondPosition = sp;
+        ensureOrder();
+        changedEvent.fire();
+    }
+
+    private void ensureOrder() {
+        if (secondPosition < firstPosition) {
+            int tmp = secondPosition;
+            secondPosition = firstPosition;
+            firstPosition = tmp;
+        }
+    }
+
+    public ChangedEvent<RangeSliderModel> getColorChangedEvent() {
+        return colorChangedEvent;
+    }
+
+    public ChangedEvent<RangeSliderModel> getChangedEvent() {
+        return changedEvent;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml
new file mode 100644
index 0000000..c0c4cd4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.view" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.view.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf
new file mode 100644
index 0000000..870dc90
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+OpenIDE-Module: com.sun.hotspot.igv.view

+OpenIDE-Module-Layer: com/sun/hotspot/igv/view/layer.xml

+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/view/Bundle.properties

+OpenIDE-Module-Specification-Version: 1.0

+

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml
new file mode 100644
index 0000000..0de8e53
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.view-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties
new file mode 100644
index 0000000..8d7a4ea
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=2de95ef6
+build.xml.script.CRC32=31afe4b1
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2de95ef6
+nbproject/build-impl.xml.script.CRC32=fa7a4119
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties
new file mode 100644
index 0000000..68ad75e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties
new file mode 100644
index 0000000..152f44e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml
new file mode 100644
index 0000000..96b1031
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.view</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.view</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties
new file mode 100644
index 0000000..29d7cc9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer
new file mode 100644
index 0000000..ad042e6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer
@@ -0,0 +1 @@
+com.sun.hotspot.igv.view.GraphViewerImplementation

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider
new file mode 100644
index 0000000..e057d73
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider
@@ -0,0 +1 @@
+com.sun.hotspot.igv.view.EditorInputGraphProvider

diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java
new file mode 100644
index 0000000..87b8fd3c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+    private double minFactor = 0.0;
+    private double maxFactor = Double.MAX_VALUE;
+    private double zoomMultiplier;
+    private boolean useAnimator;
+
+    public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+        assert zoomMultiplier > 1.0;
+        this.zoomMultiplier = zoomMultiplier;
+        this.useAnimator = useAnimator;
+    }
+
+    public double getMinFactor() {
+        return minFactor;
+    }
+
+    public void setMinFactor(double d) {
+        minFactor = d;
+    }
+
+    public double getMaxFactor() {
+        return maxFactor;
+    }
+
+    public void setMaxFactor(double d) {
+        maxFactor = d;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+        final Scene scene = widget.getScene();
+        int amount = event.getWheelRotation();
+        JScrollPane scrollPane = findScrollPane(scene.getView());
+        Point viewPosition = null;
+        Point mouseLocation = scene.convertSceneToView(event.getPoint());
+        int xOffset = 0;
+        int yOffset = 0;
+        Rectangle bounds = new Rectangle(scene.getBounds());
+        Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+        if (scrollPane != null) {
+            viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+            xOffset = (mouseLocation.x - viewPosition.x);
+            yOffset = (mouseLocation.y - viewPosition.y);
+            viewPosition.x += xOffset;
+            viewPosition.y += yOffset;
+        }
+
+        if (useAnimator) {
+            SceneAnimator sceneAnimator = scene.getSceneAnimator();
+            synchronized (sceneAnimator) {
+                double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+                while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+                    zoom /= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x /= zoomMultiplier;
+                        viewPosition.y /= zoomMultiplier;
+                        bounds.width /= zoomMultiplier;
+                        bounds.height /= zoomMultiplier;
+                        componentSize.width /= zoomMultiplier;
+                        componentSize.height /= zoomMultiplier;
+                    }
+                    amount--;
+                }
+                while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+                    zoom *= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x *= zoomMultiplier;
+                        viewPosition.y *= zoomMultiplier;
+                        bounds.width *= zoomMultiplier;
+                        bounds.height *= zoomMultiplier;
+                        componentSize.width *= zoomMultiplier;
+                        componentSize.height *= zoomMultiplier;
+                    }
+                    amount++;
+                }
+                sceneAnimator.animateZoomFactor(zoom);
+            }
+        } else {
+            double zoom = scene.getZoomFactor();
+            while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+                zoom /= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x /= zoomMultiplier;
+                    viewPosition.y /= zoomMultiplier;
+                    bounds.width /= zoomMultiplier;
+                    bounds.height /= zoomMultiplier;
+                    componentSize.width /= zoomMultiplier;
+                    componentSize.height /= zoomMultiplier;
+                }
+                amount--;
+            }
+            while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+                zoom *= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x *= zoomMultiplier;
+                    viewPosition.y *= zoomMultiplier;
+                    bounds.width *= zoomMultiplier;
+                    bounds.height *= zoomMultiplier;
+                    componentSize.width *= zoomMultiplier;
+                    componentSize.height *= zoomMultiplier;
+                }
+                amount++;
+            }
+            scene.setZoomFactor(zoom);
+        }
+
+        if (scrollPane != null) {
+            viewPosition.x -= xOffset;
+            viewPosition.y -= yOffset;
+            scrollPane.getViewport().setViewPosition(viewPosition);
+        }
+
+
+        return WidgetAction.State.CONSUMED;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties
new file mode 100644
index 0000000..4593549
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties
@@ -0,0 +1,3 @@
+HINT_EditorTopComponent=This is a Editor window
+OpenIDE-Module-Name=View
+CTL_EditorTopComponent=Editor Window
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java
new file mode 100644
index 0000000..3ede4ba
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import java.awt.Point;
+import java.awt.Rectangle;
+import org.netbeans.api.visual.anchor.Anchor;
+import org.netbeans.api.visual.anchor.Anchor.Entry;
+import org.netbeans.api.visual.anchor.Anchor.Result;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionAnchor extends Anchor {
+
+    public enum HorizontalAlignment {
+
+        Left,
+        Center,
+        Right
+    }
+    private HorizontalAlignment alignment;
+
+    public ConnectionAnchor(Widget widget) {
+        this(HorizontalAlignment.Center, widget);
+    }
+
+    public ConnectionAnchor(HorizontalAlignment alignment, Widget widget) {
+        super(widget);
+        this.alignment = alignment;
+    }
+
+    public Result compute(Entry entry) {
+        return new Result(getRelatedSceneLocation(), Anchor.DIRECTION_ANY);
+    }
+
+    @Override
+    public Point getRelatedSceneLocation() {
+        Point p = null;
+        Widget w = getRelatedWidget();
+        if (w != null) {
+            if (w instanceof SlotWidget) {
+                p = ((SlotWidget) w).getAnchorPosition();
+            } else {
+                Rectangle r = w.convertLocalToScene(w.getBounds());
+                int y = r.y + r.height / 2;
+                int x = r.x;
+                if (alignment == HorizontalAlignment.Center) {
+                    x = r.x + r.width / 2;
+                } else if (alignment == HorizontalAlignment.Right) {
+                    x = r.x + r.width;
+                }
+
+                p = new Point(x, y);
+            }
+        }
+
+        return p;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java
new file mode 100644
index 0000000..2ee3067
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java
@@ -0,0 +1,1254 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.BlockWidget;
+import com.sun.hotspot.igv.view.widgets.LineWidget;
+import com.sun.hotspot.igv.util.DoubleClickAction;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalClusterLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.OldHierarchicalLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.view.widgets.FigureWidget;
+import com.sun.hotspot.igv.view.widgets.InputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.OutputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.graph.Block;
+import com.sun.hotspot.igv.util.ColorIcon;
+import com.sun.hotspot.igv.util.ExtendedSelectAction;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.AbstractUndoableEdit;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramScene extends Scene implements ChangedListener<DiagramViewModel> {
+
+    private Hashtable<Figure, FigureWidget> figureWidgets;
+    private Hashtable<Slot, SlotWidget> slotWidgets;
+    private Hashtable<Connection, ConnectionWidget> connectionWidgets;
+    private Hashtable<InputBlock, BlockWidget> blockWidgets;
+    private Widget hoverWidget;
+    private WidgetAction hoverAction;
+    private List<FigureWidget> selectedWidgets;
+    private Lookup lookup;
+    private InstanceContent content;
+    private Action[] actions;
+    private LayerWidget connectionLayer;
+    private JScrollPane scrollPane;
+    private UndoRedo.Manager undoRedoManager;
+    private LayerWidget mainLayer;
+    private LayerWidget slotLayer;
+    private LayerWidget blockLayer;
+    private double realZoomFactor;
+    private BoundedZoomAction zoomAction;
+    private WidgetAction panAction;
+    private Widget topLeft;
+    private Widget bottomRight;
+    private LayerWidget startLayer;
+    private LabelWidget startLabel;
+    private DiagramViewModel model;
+    private DiagramViewModel modelCopy;
+    public static final int AFTER = 1;
+    public static final int BEFORE = 1;
+    public static final float ALPHA = 0.4f;
+    public static final int GRID_SIZE = 30;
+    public static final int BORDER_SIZE = 20;
+    public static final int UNDOREDO_LIMIT = 100;
+    public static final int SCROLL_UNIT_INCREMENT = 80;
+    public static final int SCROLL_BLOCK_INCREMENT = 400;
+    public static final float ZOOM_MAX_FACTOR = 3.0f;
+    public static final float ZOOM_MIN_FACTOR = 0.0f;//0.15f;
+    public static final float ZOOM_INCREMENT = 1.5f;
+    public static final int SLOT_OFFSET = 6;
+    public static final int ANIMATION_LIMIT = 40;
+    private PopupMenuProvider popupMenuProvider = new PopupMenuProvider() {
+
+        public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+            return DiagramScene.this.createPopupMenu();
+        }
+    };
+    private RectangularSelectDecorator rectangularSelectDecorator = new RectangularSelectDecorator() {
+
+        public Widget createSelectionWidget() {
+            Widget widget = new Widget(DiagramScene.this);
+            widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+            widget.setForeground(Color.red);
+            return widget;
+        }
+    };
+    private RectangularSelectProvider rectangularSelectProvider = new RectangularSelectProvider() {
+
+        public void performSelection(Rectangle rectangle) {
+            if (rectangle.width < 0) {
+                rectangle.x += rectangle.width;
+                rectangle.width *= -1;
+            }
+
+            if (rectangle.height < 0) {
+                rectangle.y += rectangle.height;
+                rectangle.height *= -1;
+            }
+
+            boolean updated = false;
+            for (Figure f : getModel().getDiagramToView().getFigures()) {
+                FigureWidget w = figureWidgets.get(f);
+                Rectangle r = new Rectangle(w.getBounds());
+                r.setLocation(w.getLocation());
+                if (r.intersects(rectangle)) {
+                    if (!selectedWidgets.contains(w)) {
+                        addToSelection(w);
+                        updated = true;
+                    }
+                } else {
+                    if (selectedWidgets.contains(w)) {
+                        selectedWidgets.remove(w);
+                        content.remove(w.getNode());
+                        w.setState(w.getState().deriveSelected(false));
+                        updated = true;
+                    }
+                }
+            }
+
+            if (updated) {
+                selectionUpdated();
+            }
+        }
+    };
+    private SelectProvider selectProvider = new SelectProvider() {
+
+        public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+            return false;
+        }
+
+        public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+            return widget instanceof FigureWidget || widget == DiagramScene.this;
+        }
+
+        public void select(Widget w, Point point, boolean change) {
+
+            boolean updated = false;
+
+            if (w == DiagramScene.this) {
+                if (DiagramScene.this.selectedWidgets.size() != 0) {
+                    clearSelection();
+                    selectionUpdated();
+                }
+                return;
+            }
+
+            FigureWidget widget = (FigureWidget) w;
+
+
+            if (change) {
+                if (widget.getState().isSelected()) {
+                    assert selectedWidgets.contains(widget);
+                    widget.setState(widget.getState().deriveSelected(false));
+                    selectedWidgets.remove(widget);
+                    content.remove(widget.getNode());
+                    updated = true;
+                } else {
+                    assert !selectedWidgets.contains(widget);
+                    addToSelection(widget);
+                    updated = true;
+                    assert widget.getState().isSelected();
+                }
+            } else {
+
+                if (widget.getState().isSelected()) {
+                    assert selectedWidgets.contains(widget);
+                } else {
+
+                    assert !selectedWidgets.contains(widget);
+                    clearSelection();
+                    addToSelection(widget);
+                    updated = true;
+                    assert widget.getState().isSelected();
+                }
+            }
+
+            if (updated) {
+                selectionUpdated();
+            }
+
+        }
+    };
+
+    private FigureWidget getFigureWidget(Figure f) {
+        return figureWidgets.get(f);
+    }
+    private FocusListener focusListener = new FocusListener() {
+
+        public void focusGained(FocusEvent e) {
+            DiagramScene.this.getView().requestFocus();
+        }
+
+        public void focusLost(FocusEvent e) {
+        }
+    };
+    private MouseWheelListener mouseWheelListener = new MouseWheelListener() {
+
+        public void mouseWheelMoved(MouseWheelEvent e) {
+            DiagramScene.this.zoomAction.mouseWheelMoved(DiagramScene.this, new WidgetAction.WidgetMouseWheelEvent(0, e));
+            DiagramScene.this.validate();
+        }
+    };
+    private MouseListener mouseListener = new MouseListener() {
+
+        public void mouseClicked(MouseEvent e) {
+            DiagramScene.this.panAction.mouseClicked(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mousePressed(MouseEvent e) {
+            DiagramScene.this.panAction.mousePressed(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            DiagramScene.this.panAction.mouseReleased(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseEntered(MouseEvent e) {
+            DiagramScene.this.panAction.mouseEntered(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseExited(MouseEvent e) {
+            DiagramScene.this.panAction.mouseExited(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+    };
+    private MouseMotionListener mouseMotionListener = new MouseMotionListener() {
+
+        public void mouseDragged(MouseEvent e) {
+            DiagramScene.this.panAction.mouseDragged(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseMoved(MouseEvent e) {
+        }
+    };
+    private ScrollChangeListener scrollChangeListener = new ScrollChangeListener();
+
+    private class ScrollChangeListener implements ChangeListener {
+
+        private Map<Widget, Point> relativePositions = new HashMap<Widget, Point>();
+        private Point oldPosition;
+
+        public void register(Widget w, Point p) {
+            relativePositions.put(w, p);
+        }
+
+        public void unregister(Widget w) {
+            relativePositions.remove(w);
+        }
+
+        public void stateChanged(ChangeEvent e) {
+            Point p = DiagramScene.this.getScrollPane().getViewport().getViewPosition();
+            if (oldPosition == null || !p.equals(oldPosition)) {
+                for (Widget w : relativePositions.keySet()) {
+                    Point curPoint = relativePositions.get(w);
+                    Point newPoint = new Point(p.x + curPoint.x, p.y + curPoint.y);
+                    w.setPreferredLocation(newPoint);
+                    DiagramScene.this.validate();
+                }
+                oldPosition = p;
+            }
+        }
+    }
+
+    public Point getScrollPosition() {
+        return getScrollPane().getViewport().getViewPosition();
+    }
+
+    public void setScrollPosition(Point p) {
+        getScrollPane().getViewport().setViewPosition(p);
+    }
+
+    public DiagramScene(Action[] actions, DiagramViewModel model) {
+        this.actions = actions;
+        selectedWidgets = new ArrayList<FigureWidget>();
+        content = new InstanceContent();
+        lookup = new AbstractLookup(content);
+        this.setCheckClipping(true);
+        this.getInputBindings().setZoomActionModifiers(0);
+
+        JComponent comp = this.createView();
+        comp.setDoubleBuffered(true);
+        comp.setBackground(Color.WHITE);
+        comp.setOpaque(true);
+
+        this.setBackground(Color.WHITE);
+        this.setOpaque(true);
+        scrollPane = new JScrollPane(comp);
+        scrollPane.setBackground(Color.WHITE);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+        scrollPane.getVerticalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+        scrollPane.getHorizontalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+        scrollPane.getHorizontalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+        scrollPane.getViewport().addChangeListener(scrollChangeListener);
+        hoverAction = this.createWidgetHoverAction();
+
+        blockLayer = new LayerWidget(this);
+        this.addChild(blockLayer);
+
+        startLayer = new LayerWidget(this);
+        this.addChild(startLayer);
+        // TODO: String startLabelString = "Loading graph with " + originalDiagram.getFigures().size() + " figures and " + originalDiagram.getConnections().size() + " connections...";
+        String startLabelString = "";
+        LabelWidget w = new LabelWidget(this, startLabelString);
+        scrollChangeListener.register(w, new Point(10, 10));
+        w.setAlignment(LabelWidget.Alignment.CENTER);
+        startLabel = w;
+        startLayer.addChild(w);
+
+        mainLayer = new LayerWidget(this);
+        this.addChild(mainLayer);
+
+        topLeft = new Widget(this);
+        topLeft.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+        this.addChild(topLeft);
+
+
+        bottomRight = new Widget(this);
+        bottomRight.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+        this.addChild(bottomRight);
+
+        slotLayer = new LayerWidget(this);
+        this.addChild(slotLayer);
+
+        connectionLayer = new LayerWidget(this);
+        this.addChild(connectionLayer);
+
+        LayerWidget selectionLayer = new LayerWidget(this);
+        this.addChild(selectionLayer);
+
+        this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+        this.getActions().addAction(hoverAction);
+        zoomAction = new BoundedZoomAction(1.1, false);
+        zoomAction.setMaxFactor(ZOOM_MAX_FACTOR);
+        zoomAction.setMinFactor(ZOOM_MIN_FACTOR);
+        this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+        panAction = new ExtendedPanAction();
+        this.getActions().addAction(panAction);
+        this.getActions().addAction(ActionFactory.createPopupMenuAction(popupMenuProvider));
+
+        LayerWidget selectLayer = new LayerWidget(this);
+        this.addChild(selectLayer);
+        this.getActions().addAction(ActionFactory.createRectangularSelectAction(rectangularSelectDecorator, selectLayer, rectangularSelectProvider));
+
+        blockWidgets = new Hashtable<InputBlock, BlockWidget>();
+
+        boolean b = this.getUndoRedoEnabled();
+        this.setUndoRedoEnabled(false);
+        this.setNewModel(model);
+        this.setUndoRedoEnabled(b);
+    }
+
+    private void selectionUpdated() {
+        getModel().setSelectedNodes(this.getSelectedNodes());
+        addUndo();
+    }
+
+    public DiagramViewModel getModel() {
+        return model;
+    }
+
+    public void setRealZoomFactor(double d) {
+        this.realZoomFactor = d;
+    }
+
+    public double getRealZoomFactor() {
+        if (realZoomFactor == 0.0) {
+            return getZoomFactor();
+        } else {
+            return realZoomFactor;
+        }
+    }
+
+    public JScrollPane getScrollPane() {
+        return scrollPane;
+    }
+
+    public boolean isAllVisible() {
+        return getModel().getHiddenNodes().size() == 0;
+    }
+
+    public Action createGotoAction(final Figure f) {
+        final DiagramScene diagramScene = this;
+        Action a = new AbstractAction() {
+
+            public void actionPerformed(ActionEvent e) {
+                diagramScene.gotoFigure(f);
+            }
+        };
+
+        a.setEnabled(true);
+        a.putValue(Action.SMALL_ICON, new ColorIcon(f.getColor()));
+        String name = f.getLines()[0];
+
+        name += " (";
+
+        if (f.getCluster() != null) {
+            name += "B" + f.getCluster().toString();
+        }
+        if (!this.getFigureWidget(f).isVisible()) {
+            if (f.getCluster() != null) {
+                name += ", ";
+            }
+            name += "hidden";
+        }
+        name += ")";
+        a.putValue(Action.NAME, name);
+        return a;
+    }
+
+    public void setNewModel(DiagramViewModel model) {
+        if (this.model != null) {
+            this.model.getDiagramChangedEvent().removeListener(this);
+            this.model.getViewPropertiesChangedEvent().removeListener(this);
+        }
+        this.model = model;
+
+        if (this.model == null) {
+            this.modelCopy = null;
+        } else {
+            this.modelCopy = this.model.copy();
+        }
+
+        model.getDiagramChangedEvent().addListener(this);
+        model.getViewPropertiesChangedEvent().addListener(this);
+
+        update();
+    }
+
+    private void update() {
+
+        /*if (startLabel != null) {
+        // Animate fade-out
+        final LabelWidget labelWidget = this.startLabel;
+        labelWidget.setVisible(true);
+        RequestProcessor.getDefault().post(new Runnable() {
+        public void run() {
+        final int Sleep = 200;
+        final int Progress = 10;
+        for (int i = 0; i < 255 / Progress + 1; i++) {
+        try {
+        SwingUtilities.invokeAndWait(new Runnable() {
+        public void run() {
+        Color c = labelWidget.getForeground();
+        int v = c.getRed();
+        v += Progress;
+        if (v > 255) {
+        v = 255;
+        }
+        labelWidget.setForeground(new Color(v, v, v, 255 - v));
+        labelWidget.getScene().validate();
+        }
+        });
+        } catch (InterruptedException ex) {
+        } catch (InvocationTargetException ex) {
+        }
+        try {
+        Thread.sleep(Sleep);
+        } catch (InterruptedException ex) {
+        }
+        }
+        labelWidget.setVisible(false);
+        DiagramScene.this.scrollChangeListener.unregister(labelWidget);
+        }
+        }, 1000);
+        startLabel = null;
+        }*/
+
+        slotLayer.removeChildren();
+        mainLayer.removeChildren();
+        blockLayer.removeChildren();
+
+        blockWidgets.clear();
+        figureWidgets = new Hashtable<Figure, FigureWidget>();
+        slotWidgets = new Hashtable<Slot, SlotWidget>();
+        connectionWidgets = new Hashtable<Connection, ConnectionWidget>();
+
+        WidgetAction selectAction = new ExtendedSelectAction(selectProvider);
+        Diagram d = getModel().getDiagramToView();
+
+        if (getModel().getShowBlocks()) {
+            Scheduler s = Lookup.getDefault().lookup(Scheduler.class);
+            Collection<InputBlock> newBlocks = new ArrayList<InputBlock>(s.schedule(d.getGraph()));
+            d.schedule(newBlocks);
+        }
+
+        for (Figure f : d.getFigures()) {
+            FigureWidget w = new FigureWidget(f, this, mainLayer);
+            w.getActions().addAction(selectAction);
+            w.getActions().addAction(hoverAction);
+            w.getActions().addAction(ActionFactory.createPopupMenuAction(w));
+            w.getActions().addAction(new DoubleClickAction(w));
+            w.setVisible(false);
+
+            figureWidgets.put(f, w);
+
+            for (InputSlot s : f.getInputSlots()) {
+                SlotWidget sw = new InputSlotWidget(s, this, slotLayer, w);
+                slotWidgets.put(s, sw);
+                sw.getActions().addAction(selectAction);
+            }
+
+            for (OutputSlot s : f.getOutputSlots()) {
+                SlotWidget sw = new OutputSlotWidget(s, this, slotLayer, w);
+                slotWidgets.put(s, sw);
+                sw.getActions().addAction(selectAction);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock bn : d.getGraph().getBlocks()) {
+                BlockWidget w = new BlockWidget(this, d, bn);
+                w.setVisible(false);
+                blockWidgets.put(bn, w);
+                blockLayer.addChild(w);
+            }
+        }
+
+        this.smallUpdate(true);
+
+    }
+
+    private void smallUpdate(boolean relayout) {
+
+        this.updateHiddenNodes(model.getHiddenNodes(), relayout);
+        boolean b = this.getUndoRedoEnabled();
+        this.setUndoRedoEnabled(false);
+        this.setSelection(getModel().getSelectedNodes());
+        this.setUndoRedoEnabled(b);
+        this.validate();
+    }
+
+    private boolean isVisible(Connection c) {
+        FigureWidget w1 = figureWidgets.get(c.getInputSlot().getFigure());
+        FigureWidget w2 = figureWidgets.get(c.getOutputSlot().getFigure());
+
+        if (w1.isVisible() && w2.isVisible()) {
+            return true;
+        }
+
+        return false;
+    }
+
+    private void relayout(Set<Widget> oldVisibleWidgets) {
+
+        Diagram diagram = getModel().getDiagramToView();
+
+        HashSet<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                figures.add(f);
+            }
+        }
+
+        HashSet<Connection> edges = new HashSet<Connection>();
+
+        for (Connection c : diagram.getConnections()) {
+            if (isVisible(c)) {
+                edges.add(c);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            HierarchicalClusterLayoutManager m = new HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            manager.setMaxLayerLength(9);
+            manager.setMinLayerDifference(3);
+            m.setManager(manager);
+            m.setSubManager(new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS));
+            m.doLayout(new LayoutGraph(edges, figures));
+
+        } else {
+            HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            manager.setMaxLayerLength(10);
+            manager.doLayout(new LayoutGraph(edges, figures));
+        }
+
+        int maxX = -BORDER_SIZE;
+        int maxY = -BORDER_SIZE;
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                Point p = f.getPosition();
+                Dimension d = f.getSize();
+                maxX = Math.max(maxX, p.x + d.width);
+                maxY = Math.max(maxY, p.y + d.height);
+            }
+        }
+
+        for (Connection c : diagram.getConnections()) {
+            List<Point> points = c.getControlPoints();
+            FigureWidget w1 = figureWidgets.get((Figure) c.getTo().getVertex());
+            FigureWidget w2 = figureWidgets.get((Figure) c.getFrom().getVertex());
+            if (w1.isVisible() && w2.isVisible()) {
+                for (Point p : points) {
+                    if (p != null) {
+                        maxX = Math.max(maxX, p.x);
+                        maxY = Math.max(maxY, p.y);
+                    }
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (Block b : diagram.getBlocks()) {
+                BlockWidget w = blockWidgets.get(b.getInputBlock());
+                if (w != null && w.isVisible()) {
+                    Rectangle r = b.getBounds();
+                    maxX = Math.max(maxX, r.x + r.width);
+                    maxY = Math.max(maxY, r.y + r.height);
+                }
+            }
+        }
+
+        bottomRight.setPreferredLocation(new Point(maxX + BORDER_SIZE, maxY + BORDER_SIZE));
+        int offx = 0;
+        int offy = 0;
+        int curWidth = maxX + 2 * BORDER_SIZE;
+        int curHeight = maxY + 2 * BORDER_SIZE;
+
+        Rectangle bounds = this.getScrollPane().getBounds();
+        if (curWidth < bounds.width) {
+            offx = (bounds.width - curWidth) / 2;
+        }
+
+        if (curHeight < bounds.height) {
+            offy = (bounds.height - curHeight) / 2;
+        }
+
+        final int offx2 = offx;
+        final int offy2 = offy;
+
+        SceneAnimator animator = this.getSceneAnimator();
+        connectionLayer.removeChildren();
+        int visibleFigureCount = 0;
+        for (Figure f : diagram.getFigures()) {
+            if (figureWidgets.get(f).isVisible()) {
+                visibleFigureCount++;
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            for (OutputSlot s : f.getOutputSlots()) {
+                SceneAnimator anim = animator;
+                if (visibleFigureCount > ANIMATION_LIMIT) {
+                    anim = null;
+                }
+                processOutputSlot(s, s.getConnections(), 0, null, null, offx2, offy2, anim);
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                Point p = f.getPosition();
+                Point p2 = new Point(p.x + offx2, p.y + offy2);
+                Rectangle r = new Rectangle(p.x + offx2, p.y + offy2, f.getSize().width, f.getSize().height);
+                if (oldVisibleWidgets.contains(w)) {
+                    if (visibleFigureCount > ANIMATION_LIMIT) {
+                        w.setPreferredLocation(p2);
+                    } else {
+                        animator.animatePreferredLocation(w, p2);
+                    }
+                } else {
+                    w.setPreferredLocation(p2);
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (Block b : diagram.getBlocks()) {
+                BlockWidget w = blockWidgets.get(b.getInputBlock());
+                if (w != null && w.isVisible()) {
+                    Point location = new Point(b.getBounds().x + offx2, b.getBounds().y + offy2);
+                    Rectangle r = new Rectangle(location.x, location.y, b.getBounds().width, b.getBounds().height);
+                    if (oldVisibleWidgets.contains(w)) {
+                        if (visibleFigureCount > ANIMATION_LIMIT) {
+                            w.setPreferredBounds(r);
+                        } else {
+                            animator.animatePreferredBounds(w, r);
+                        }
+                    } else {
+                        w.setPreferredBounds(r);
+                    }
+                }
+            }
+        }
+    }
+    private final Point specialNullPoint = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
+
+    private void processOutputSlot(OutputSlot s, List<Connection> connections, int controlPointIndex, Point lastPoint, LineWidget predecessor, int offx, int offy, SceneAnimator animator) {
+        Map<Point, List<Connection>> pointMap = new HashMap<Point, List<Connection>>();
+
+        for (Connection c : connections) {
+
+            if (!isVisible(c)) {
+                continue;
+            }
+
+            List<Point> controlPoints = c.getControlPoints();
+            if (controlPointIndex >= controlPoints.size()) {
+                continue;
+            }
+
+            Point cur = controlPoints.get(controlPointIndex);
+            if (cur == null) {
+                cur = specialNullPoint;
+            } else if (controlPointIndex == 0 && !s.getShowName()) {
+                cur = new Point(cur.x, cur.y - SLOT_OFFSET);
+            } else if (controlPointIndex == controlPoints.size() - 1 && !c.getInputSlot().getShowName()) {
+                cur = new Point(cur.x, cur.y + SLOT_OFFSET);
+            }
+
+            if (pointMap.containsKey(cur)) {
+                pointMap.get(cur).add(c);
+            } else {
+                List<Connection> newList = new ArrayList<Connection>(2);
+                newList.add(c);
+                pointMap.put(cur, newList);
+            }
+
+        }
+
+        for (Point p : pointMap.keySet()) {
+            List<Connection> connectionList = pointMap.get(p);
+
+            boolean isBold = false;
+            boolean isDashed = true;
+
+            for (Connection c : connectionList) {
+
+                if (c.getStyle() == Connection.ConnectionStyle.BOLD) {
+                    isBold = true;
+                }
+
+                if (c.getStyle() != Connection.ConnectionStyle.DASHED) {
+                    isDashed = false;
+                }
+            }
+
+            LineWidget newPredecessor = predecessor;
+            if (p == specialNullPoint) {
+
+            } else if (lastPoint == specialNullPoint) {
+
+            } else if (lastPoint != null) {
+                Point p1 = new Point(lastPoint.x + offx, lastPoint.y + offy);
+                Point p2 = new Point(p.x + offx, p.y + offy);
+                LineWidget w = new LineWidget(this, s, connectionList, p1, p2, predecessor, animator, isBold, isDashed);
+                newPredecessor = w;
+                connectionLayer.addChild(w);
+                w.getActions().addAction(hoverAction);
+            }
+
+            processOutputSlot(s, connectionList, controlPointIndex + 1, p, newPredecessor, offx, offy, animator);
+        }
+    }
+
+    private void clearSelection() {
+        if (selectedWidgets.size() == 0) {
+            return;
+        }
+        for (FigureWidget w : selectedWidgets) {
+            assert w.getState().isSelected();
+            w.setState(w.getState().deriveSelected(false));
+            content.remove(w.getNode());
+        }
+        selectedWidgets.clear();
+    }
+
+    public Lookup getLookup() {
+        return lookup;
+    }
+
+    public void gotoFigures(final List<Figure> figures) {
+        Rectangle overall = null;
+        showFigures(figures);
+        for (Figure f : figures) {
+
+            FigureWidget fw = getFigureWidget(f);
+            if (fw != null) {
+                Rectangle r = fw.getBounds();
+                Point p = fw.getLocation();
+                Rectangle r2 = new Rectangle(p.x, p.y, r.width, r.height);
+
+                if (overall == null) {
+                    overall = r2;
+                } else {
+                    overall = overall.union(r2);
+                }
+            }
+        }
+        if (overall != null) {
+            centerRectangle(overall);
+        }
+    }
+
+    private Point calcCenter(Rectangle r) {
+
+        Point center = new Point((int) r.getCenterX(), (int) r.getCenterY());
+        center.x -= getScrollPane().getViewport().getViewRect().width / 2;
+        center.y -= getScrollPane().getViewport().getViewRect().height / 2;
+
+        // Ensure to be within area
+        center.x = Math.max(0, center.x);
+        center.x = Math.min(getScrollPane().getViewport().getViewSize().width - getScrollPane().getViewport().getViewRect().width, center.x);
+        center.y = Math.max(0, center.y);
+        center.y = Math.min(getScrollPane().getViewport().getViewSize().height - getScrollPane().getViewport().getViewRect().height, center.y);
+
+        return center;
+    }
+
+    private void centerRectangle(Rectangle r) {
+
+        if (getScrollPane().getViewport().getViewRect().width == 0 || getScrollPane().getViewport().getViewRect().height == 0) {
+            return;
+        }
+
+        Rectangle r2 = new Rectangle(r.x, r.y, r.width, r.height);
+        r2 = convertSceneToView(r2);
+
+        double factorX = (double) r2.width / (double) getScrollPane().getViewport().getViewRect().width;
+        double factorY = (double) r2.height / (double) getScrollPane().getViewport().getViewRect().height;
+        double factor = Math.max(factorX, factorY);
+        if (factor >= 1.0) {
+            Point p = getScrollPane().getViewport().getViewPosition();
+            setZoomFactor(getZoomFactor() / factor);
+            r2.x /= factor;
+            r2.y /= factor;
+            r2.width /= factor;
+            r2.height /= factor;
+            getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+        } else {
+            getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+        }
+    }
+
+    private void addToSelection(Figure f) {
+        FigureWidget w = getFigureWidget(f);
+        addToSelection(w);
+    }
+
+    private void addToSelection(FigureWidget w) {
+        assert !selectedWidgets.contains(w);
+        selectedWidgets.add(w);
+        content.add(w.getNode());
+        w.setState(w.getState().deriveSelected(true));
+    }
+
+    private void setSelection(Set<Integer> nodes) {
+        clearSelection();
+        for (Figure f : getModel().getDiagramToView().getFigures()) {
+            if (doesIntersect(f.getSource().getSourceNodesAsSet(), nodes)) {
+                addToSelection(f);
+            }
+        }
+        selectionUpdated();
+        this.validate();
+    }
+
+    public void setSelection(Collection<Figure> list) {
+        clearSelection();
+        for (Figure f : list) {
+            addToSelection(f);
+        }
+
+        selectionUpdated();
+        this.validate();
+    }
+
+    public Set<Figure> getSelectedFigures() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Widget w : selectedWidgets) {
+            if (w instanceof FigureWidget) {
+                FigureWidget fw = (FigureWidget) w;
+                if (fw.getState().isSelected()) {
+                    result.add(fw.getFigure());
+                }
+            }
+        }
+        return result;
+    }
+
+    public Set<Integer> getSelectedNodes() {
+        Set<Integer> result = new HashSet<Integer>();
+        for (Widget w : selectedWidgets) {
+            if (w instanceof FigureWidget) {
+                FigureWidget fw = (FigureWidget) w;
+                if (fw.getState().isSelected()) {
+                    result.addAll(fw.getFigure().getSource().getSourceNodesAsSet());
+                }
+            }
+        }
+        return result;
+    }
+
+    private UndoRedo.Manager getUndoRedoManager() {
+        if (undoRedoManager == null) {
+            undoRedoManager = new UndoRedo.Manager();
+            undoRedoManager.setLimit(UNDOREDO_LIMIT);
+        }
+
+        return undoRedoManager;
+    }
+
+    public UndoRedo getUndoRedo() {
+        return getUndoRedoManager();
+    }
+
+    private boolean isVisible(Figure f) {
+        for (Integer n : f.getSource().getSourceNodesAsSet()) {
+            if (getModel().getHiddenNodes().contains(n)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean doesIntersect(Set s1, Set s2) {
+        if (s1.size() > s2.size()) {
+            Set tmp = s1;
+            s1 = s2;
+            s2 = tmp;
+        }
+
+        for (Object o : s1) {
+            if (s2.contains(o)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public void showNot(final Set<Integer> nodes) {
+        updateHiddenNodes(nodes, true);
+    }
+
+    public void showOnly(final Set<Integer> nodes) {
+        HashSet<Integer> allNodes = new HashSet<Integer>(getModel().getGraphToView().getGroup().getAllNodes());
+        allNodes.removeAll(nodes);
+        updateHiddenNodes(allNodes, true);
+    }
+
+    private void updateHiddenNodes(Set<Integer> newHiddenNodes, boolean doRelayout) {
+
+        Set<InputBlock> visibleBlocks = new HashSet<InputBlock>();
+
+        Diagram diagram = getModel().getDiagramToView();
+        assert diagram != null;
+
+        Set<Widget> oldVisibleWidgets = new HashSet<Widget>();
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                oldVisibleWidgets.add(w);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock b : diagram.getGraph().getBlocks()) {
+                BlockWidget w = blockWidgets.get(b);
+                if (w.isVisible()) {
+                    oldVisibleWidgets.add(w);
+                }
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            boolean hiddenAfter = doesIntersect(f.getSource().getSourceNodesAsSet(), newHiddenNodes);
+
+            FigureWidget w = this.figureWidgets.get(f);
+            w.setBoundary(false);
+            if (!hiddenAfter) {
+                // Figure is shown
+                w.setVisible(true);
+                for (InputNode n : f.getSource().getSourceNodes()) {
+                    visibleBlocks.add(diagram.getGraph().getBlock(n));
+                }
+            } else {
+                // Figure is hidden
+                w.setVisible(false);
+            }
+        }
+
+        if (getModel().getShowNodeHull()) {
+            List<FigureWidget> boundaries = new ArrayList<FigureWidget>();
+            for (Figure f : diagram.getFigures()) {
+                FigureWidget w = this.figureWidgets.get(f);
+                if (!w.isVisible()) {
+                    Set<Figure> set = new HashSet<Figure>(f.getPredecessorSet());
+                    set.addAll(f.getSuccessorSet());
+
+                    boolean b = false;
+                    for (Figure neighbor : set) {
+                        FigureWidget neighborWidget = figureWidgets.get(neighbor);
+                        if (neighborWidget.isVisible()) {
+                            b = true;
+                            break;
+                        }
+                    }
+
+                    if (b) {
+                        w.setBoundary(true);
+                        for (InputNode n : f.getSource().getSourceNodes()) {
+                            visibleBlocks.add(diagram.getGraph().getBlock(n));
+                        }
+                        boundaries.add(w);
+                    }
+                }
+            }
+
+            for (FigureWidget w : boundaries) {
+                if (w.isBoundary()) {
+                    w.setVisible(true);
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock b : diagram.getGraph().getBlocks()) {
+
+                boolean visibleAfter = visibleBlocks.contains(b);
+
+                BlockWidget w = blockWidgets.get(b);
+                if (visibleAfter) {
+                    // Block must be shown
+                    w.setVisible(true);
+                } else {
+                    // Block must be hidden
+                    w.setVisible(false);
+                }
+            }
+        }
+
+        getModel().setHiddenNodes(newHiddenNodes);
+        if (doRelayout) {
+            relayout(oldVisibleWidgets);
+        }
+        this.validate();
+        addUndo();
+    }
+
+    private void showFigures(Collection<Figure> f) {
+        HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+        for (Figure fig : f) {
+            newHiddenNodes.removeAll(fig.getSource().getSourceNodesAsSet());
+        }
+        updateHiddenNodes(newHiddenNodes, true);
+    }
+
+    private void showFigure(Figure f) {
+        HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+        newHiddenNodes.removeAll(f.getSource().getSourceNodesAsSet());
+        updateHiddenNodes(newHiddenNodes, true);
+    }
+
+    public void showAll(final Collection<Figure> f) {
+        showFigures(f);
+
+    }
+
+    public void show(final Figure f) {
+        showFigure(f);
+    }
+
+    public void gotoFigure(final Figure f) {
+
+        if (!isVisible(f)) {
+            showFigure(f);
+        }
+
+        FigureWidget fw = getFigureWidget(f);
+        if (fw != null) {
+            Rectangle r = fw.getBounds();
+            Point p = fw.getLocation();
+            centerRectangle(new Rectangle(p.x, p.y, r.width, r.height));
+
+            // Select figure
+            clearSelection();
+            addToSelection(fw);
+            selectionUpdated();
+        }
+    }
+
+    public JPopupMenu createPopupMenu() {
+        JPopupMenu menu = new JPopupMenu();
+        for (Action a : actions) {
+            if (a == null) {
+                menu.addSeparator();
+            } else {
+                menu.add(a);
+            }
+        }
+        return menu;
+    }
+
+    private static class DiagramUndoRedo extends AbstractUndoableEdit implements ChangedListener<DiagramViewModel> {
+
+        private DiagramViewModel oldModel;
+        private DiagramViewModel newModel;
+        private Point oldScrollPosition;
+        private DiagramScene scene;
+
+        public DiagramUndoRedo(DiagramScene scene, Point oldScrollPosition, DiagramViewModel oldModel, DiagramViewModel newModel) {
+            assert oldModel != null;
+            assert newModel != null;
+            this.oldModel = oldModel;
+            this.newModel = newModel;
+            this.scene = scene;
+            this.oldScrollPosition = oldScrollPosition;
+        }
+
+        @Override
+        public void redo() throws CannotRedoException {
+            super.redo();
+            boolean b = scene.getUndoRedoEnabled();
+            scene.setUndoRedoEnabled(false);
+            scene.getModel().getViewChangedEvent().addListener(this);
+            scene.getModel().setData(newModel);
+            scene.getModel().getViewChangedEvent().removeListener(this);
+            scene.setUndoRedoEnabled(b);
+        }
+
+        @Override
+        public void undo() throws CannotUndoException {
+            super.undo();
+            boolean b = scene.getUndoRedoEnabled();
+            scene.setUndoRedoEnabled(false);
+            scene.getModel().getViewChangedEvent().addListener(this);
+            scene.getModel().setData(oldModel);
+            scene.getModel().getViewChangedEvent().removeListener(this);
+
+            SwingUtilities.invokeLater(new Runnable() {
+
+                public void run() {
+                    scene.setScrollPosition(oldScrollPosition);
+                }
+            });
+
+            scene.setUndoRedoEnabled(b);
+        }
+
+        public void changed(DiagramViewModel source) {
+            scene.getModel().getViewChangedEvent().removeListener(this);
+            if (oldModel.getSelectedNodes().equals(newModel.getHiddenNodes())) {
+                scene.smallUpdate(false);
+            } else {
+                scene.smallUpdate(true);
+            }
+        }
+    }
+    private boolean undoRedoEnabled = true;
+
+    public void setUndoRedoEnabled(boolean b) {
+        this.undoRedoEnabled = b;
+    }
+
+    public boolean getUndoRedoEnabled() {
+        return undoRedoEnabled;
+    }
+
+    public void changed(DiagramViewModel source) {
+        assert source == model : "Receive only changed event from current model!";
+        assert source != null;
+        update();
+    }
+
+    private void addUndo() {
+
+        DiagramViewModel newModelCopy = model.copy();
+
+        if (undoRedoEnabled) {
+            this.getUndoRedoManager().undoableEditHappened(new UndoableEditEvent(this, new DiagramUndoRedo(this, this.getScrollPosition(), modelCopy, newModelCopy)));
+        }
+
+        this.modelCopy = newModelCopy;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java
new file mode 100644
index 0000000..e374873
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java
@@ -0,0 +1,303 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.difference.Difference;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Color;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramViewModel extends RangeSliderModel implements ChangedListener<RangeSliderModel> {
+
+    // Warning: Update setData method if fields are added
+    private Group group;
+    private Set<Integer> hiddenNodes;
+    private Set<Integer> onScreenNodes;
+    private Set<Integer> selectedNodes;
+    private FilterChain filterChain;
+    private FilterChain sequenceFilterChain;
+    private Diagram diagram;
+    private ChangedEvent<DiagramViewModel> diagramChangedEvent;
+    private ChangedEvent<DiagramViewModel> viewChangedEvent;
+    private ChangedEvent<DiagramViewModel> viewPropertiesChangedEvent;
+    private boolean showBlocks;
+    private boolean showNodeHull;
+    private ChangedListener<FilterChain> filterChainChangedListener = new ChangedListener<FilterChain>() {
+
+        public void changed(FilterChain source) {
+            diagramChanged();
+        }
+    };
+
+    public DiagramViewModel copy() {
+        DiagramViewModel result = new DiagramViewModel(group, filterChain, sequenceFilterChain);
+        result.setData(this);
+        return result;
+    }
+
+    public void setData(DiagramViewModel newModel) {
+        super.setData(newModel);
+        boolean diagramChanged = false;
+        boolean viewChanged = false;
+        boolean viewPropertiesChanged = false;
+
+        this.group = newModel.group;
+        diagramChanged |= (filterChain != newModel.filterChain);
+        this.filterChain = newModel.filterChain;
+        diagramChanged |= (sequenceFilterChain != newModel.sequenceFilterChain);
+        this.sequenceFilterChain = newModel.sequenceFilterChain;
+        diagramChanged |= (diagram != newModel.diagram);
+        this.diagram = newModel.diagram;
+        viewChanged |= (hiddenNodes != newModel.hiddenNodes);
+        this.hiddenNodes = newModel.hiddenNodes;
+        viewChanged |= (onScreenNodes != newModel.onScreenNodes);
+        this.onScreenNodes = newModel.onScreenNodes;
+        viewChanged |= (selectedNodes != newModel.selectedNodes);
+        this.selectedNodes = newModel.selectedNodes;
+        viewPropertiesChanged |= (showBlocks != newModel.showBlocks);
+        this.showBlocks = newModel.showBlocks;
+        viewPropertiesChanged |= (showNodeHull != newModel.showNodeHull);
+        this.showNodeHull = newModel.showNodeHull;
+
+        if (diagramChanged) {
+            diagramChangedEvent.fire();
+        }
+        if (viewPropertiesChanged) {
+            viewPropertiesChangedEvent.fire();
+        }
+        if (viewChanged) {
+            viewChangedEvent.fire();
+        }
+    }
+
+    public boolean getShowBlocks() {
+        return showBlocks;
+    }
+
+    public void setShowBlocks(boolean b) {
+        showBlocks = b;
+        viewPropertiesChangedEvent.fire();
+    }
+
+    public boolean getShowNodeHull() {
+        return showNodeHull;
+    }
+
+    public void setShowNodeHull(boolean b) {
+        showNodeHull = b;
+        viewPropertiesChangedEvent.fire();
+    }
+
+    public DiagramViewModel(Group g, FilterChain filterChain, FilterChain sequenceFilterChain) {
+        super(calculateStringList(g));
+
+        this.showNodeHull = true;
+        this.showBlocks = true;
+        this.group = g;
+        assert filterChain != null;
+        this.filterChain = filterChain;
+        assert sequenceFilterChain != null;
+        this.sequenceFilterChain = sequenceFilterChain;
+        hiddenNodes = new HashSet<Integer>();
+        onScreenNodes = new HashSet<Integer>();
+        selectedNodes = new HashSet<Integer>();
+        super.getChangedEvent().addListener(this);
+        diagramChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+        viewChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+        viewPropertiesChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+
+        filterChain.getChangedEvent().addListener(filterChainChangedListener);
+        sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+    }
+
+    public ChangedEvent<DiagramViewModel> getDiagramChangedEvent() {
+        return diagramChangedEvent;
+    }
+
+    public ChangedEvent<DiagramViewModel> getViewChangedEvent() {
+        return viewChangedEvent;
+    }
+
+    public ChangedEvent<DiagramViewModel> getViewPropertiesChangedEvent() {
+        return viewPropertiesChangedEvent;
+    }
+
+    public Set<Integer> getSelectedNodes() {
+        return Collections.unmodifiableSet(selectedNodes);
+    }
+
+    public Set<Integer> getHiddenNodes() {
+        return Collections.unmodifiableSet(hiddenNodes);
+    }
+
+    public Set<Integer> getOnScreenNodes() {
+        return Collections.unmodifiableSet(onScreenNodes);
+    }
+
+    public void setSelectedNodes(Set<Integer> nodes) {
+        this.selectedNodes = nodes;
+        List<Color> colors = new ArrayList<Color>();
+        for (String s : getPositions()) {
+            colors.add(Color.black);
+        }
+        if (nodes.size() >= 1) {
+            for (Integer id : nodes) {
+                if (id < 0) {
+                    id = -id;
+                }
+                InputNode last = null;
+                int index = 0;
+                for (InputGraph g : group.getGraphs()) {
+                    Color curColor = colors.get(index);
+                    InputNode cur = g.getNode(id);
+                    if (cur != null) {
+                        if (last == null) {
+                            curColor = Color.green;
+                        } else {
+                            if (last.equals(cur)) {
+                                if (curColor == Color.black) {
+                                    curColor = Color.white;
+                                }
+                            } else {
+                                if (curColor != Color.green) {
+                                    curColor = Color.orange;
+                                }
+                            }
+                        }
+                    }
+                    last = cur;
+                    colors.set(index, curColor);
+                    index++;
+                }
+            }
+            this.setColors(colors);
+        }
+        setColors(colors);
+        viewChangedEvent.fire();
+    }
+
+    public void setHiddenNodes(Set<Integer> nodes) {
+        this.hiddenNodes = nodes;
+        viewChangedEvent.fire();
+    }
+
+    public void setOnScreenNodes(Set<Integer> onScreenNodes) {
+        this.onScreenNodes = onScreenNodes;
+        viewChangedEvent.fire();
+    }
+
+    public FilterChain getSequenceFilterChain() {
+        return filterChain;
+    }
+
+    public void setSequenceFilterChain(FilterChain chain) {
+        assert chain != null : "sequenceFilterChain must never be null";
+        sequenceFilterChain.getChangedEvent().removeListener(filterChainChangedListener);
+        sequenceFilterChain = chain;
+        sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+        diagramChanged();
+    }
+
+    private void diagramChanged() {
+        // clear diagram
+        diagram = null;
+        getDiagramChangedEvent().fire();
+
+    }
+
+    public FilterChain getFilterChain() {
+        return filterChain;
+    }
+
+    public void setFilterChain(FilterChain chain) {
+        assert chain != null : "filterChain must never be null";
+        filterChain.getChangedEvent().removeListener(filterChainChangedListener);
+        filterChain = chain;
+        filterChain.getChangedEvent().addListener(filterChainChangedListener);
+        diagramChanged();
+    }
+
+    private static List<String> calculateStringList(Group g) {
+        List<String> result = new ArrayList<String>();
+        for (InputGraph graph : g.getGraphs()) {
+            result.add(graph.getName());
+        }
+        return result;
+    }
+
+    public InputGraph getFirstGraph() {
+        return group.getGraphs().get(getFirstPosition());
+    }
+
+    public InputGraph getSecondGraph() {
+        return group.getGraphs().get(getSecondPosition());
+    }
+
+    public void selectGraph(InputGraph g) {
+        int index = group.getGraphs().indexOf(g);
+        assert index != -1;
+        setPositions(index, index);
+    }
+
+    public Diagram getDiagramToView() {
+
+        if (diagram == null) {
+            diagram = Diagram.createDiagram(getGraphToView(), Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+            getFilterChain().apply(diagram, getSequenceFilterChain());
+        }
+
+        return diagram;
+    }
+
+    public InputGraph getGraphToView() {
+        if (getFirstGraph() != getSecondGraph()) {
+            InputGraph inputGraph = Difference.createDiffGraph(getSecondGraph(), getFirstGraph());
+            return inputGraph;
+        } else {
+            InputGraph inputGraph = getFirstGraph();
+            return inputGraph;
+        }
+    }
+
+    public void changed(RangeSliderModel source) {
+        diagramChanged();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java
new file mode 100644
index 0000000..f1c3f04
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditorInputGraphProvider implements InputGraphProvider {
+
+    public InputGraph getGraph() {
+        EditorTopComponent e = EditorTopComponent.getActive();
+        if (e == null) {
+            return null;
+        }
+        return e.getDiagramModel().getGraphToView();
+    }
+
+    public void setSelectedNodes(Set<InputNode> nodes) {
+        EditorTopComponent e = EditorTopComponent.getActive();
+        if (e != null) {
+            e.setSelectedNodes(nodes);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form
new file mode 100644
index 0000000..dc990fa
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Component class="javax.swing.JCheckBox" name="jCheckBox1">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="jCheckBox1"/>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+            <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+          </Border>
+        </Property>
+        <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+          <Insets value="[0, 0, 0, 0]"/>
+        </Property>
+      </Properties>
+    </Component>
+  </NonVisualComponents>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java
new file mode 100644
index 0000000..e923544
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java
@@ -0,0 +1,577 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.actions.EnableBlockLayoutAction;
+import com.sun.hotspot.igv.view.actions.ExpandPredecessorsAction;
+import com.sun.hotspot.igv.view.actions.ExpandSuccessorsAction;
+import com.sun.hotspot.igv.view.actions.ExtractAction;
+import com.sun.hotspot.igv.view.actions.HideAction;
+import com.sun.hotspot.igv.view.actions.NextDiagramAction;
+import com.sun.hotspot.igv.view.actions.NodeFindAction;
+import com.sun.hotspot.igv.view.actions.OverviewAction;
+import com.sun.hotspot.igv.view.actions.PredSuccAction;
+import com.sun.hotspot.igv.view.actions.PrevDiagramAction;
+import com.sun.hotspot.igv.view.actions.ShowAllAction;
+import com.sun.hotspot.igv.view.actions.ZoomInAction;
+import com.sun.hotspot.igv.view.actions.ZoomOutAction;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+import com.sun.hotspot.igv.util.RangeSlider;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import com.sun.hotspot.igv.svg.BatikSVG;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.JPanel;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.actions.FindAction;
+import org.openide.actions.RedoAction;
+import org.openide.actions.UndoAction;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallbackSystemAction;
+import org.openide.util.actions.SystemAction;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+import org.openide.util.lookup.ProxyLookup;
+import org.openide.windows.Mode;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.NotifyDescriptor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class EditorTopComponent extends TopComponent implements ChangedListener<RangeSliderModel>, PropertyChangeListener {
+
+    private DiagramScene scene;
+    private InstanceContent content;
+    private FindPanel findPanel;
+    private EnableBlockLayoutAction blockLayoutAction;
+    private OverviewAction overviewAction;
+    private PredSuccAction predSuccAction;
+    private boolean notFirstTime;
+    private ExtendedSatelliteComponent satelliteComponent;
+    private JPanel centerPanel;
+    private CardLayout cardLayout;
+    private RangeSlider rangeSlider;
+    private JToggleButton overviewButton;
+    private static final String PREFERRED_ID = "EditorTopComponent";
+    private static final String SATELLITE_STRING = "satellite";
+    private static final String SCENE_STRING = "scene";
+    private DiagramViewModel rangeSliderModel;
+    private ExportCookie exportCookie = new ExportCookie() {
+
+        public void export(File f) {
+
+            Graphics2D svgGenerator = BatikSVG.createGraphicsObject();
+
+            if (svgGenerator == null) {
+                NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+                DialogDisplayer.getDefault().notifyLater(message);
+            } else {
+                scene.paint(svgGenerator);
+                FileOutputStream os = null;
+                try {
+                    os = new FileOutputStream(f);
+                    Writer out = new OutputStreamWriter(os, "UTF-8");
+                    BatikSVG.printToStream(svgGenerator, out, true);
+                } catch (FileNotFoundException e) {
+                    NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+                    DialogDisplayer.getDefault().notifyLater(message);
+
+                } catch (UnsupportedEncodingException e) {
+                } finally {
+                    if (os != null) {
+                        try {
+                            os.close();
+                        } catch (IOException e) {
+                        }
+                    }
+                }
+
+            }
+        }
+    };
+
+    private void updateDisplayName() {
+        setDisplayName(getDiagram().getName());
+    }
+
+    public EditorTopComponent(Diagram diagram) {
+
+        FilterChain filterChain = null;
+        FilterChain sequence = null;
+        FilterChainProvider provider = Lookup.getDefault().lookup(FilterChainProvider.class);
+        if (provider == null) {
+            filterChain = new FilterChain();
+            sequence = new FilterChain();
+        } else {
+            filterChain = provider.getFilterChain();
+            sequence = provider.getSequence();
+        }
+
+        setName(NbBundle.getMessage(EditorTopComponent.class, "CTL_EditorTopComponent"));
+        setToolTipText(NbBundle.getMessage(EditorTopComponent.class, "HINT_EditorTopComponent"));
+
+        Action[] actions = new Action[]{
+            PrevDiagramAction.get(PrevDiagramAction.class),
+            NextDiagramAction.get(NextDiagramAction.class),
+            null,
+            ExtractAction.get(ExtractAction.class),
+            ShowAllAction.get(HideAction.class),
+            ShowAllAction.get(ShowAllAction.class),
+            null,
+            ZoomInAction.get(ZoomInAction.class),
+            ZoomOutAction.get(ZoomOutAction.class),
+            null,
+            ExpandPredecessorsAction.get(ExpandPredecessorsAction.class),
+            ExpandSuccessorsAction.get(ExpandSuccessorsAction.class)
+        };
+
+
+        initComponents();
+
+        ActionMap actionMap = getActionMap();
+
+        ToolbarPool.getDefault().setPreferredIconSize(16);
+        Toolbar toolBar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolBar.setBorder(b);
+        JPanel container = new JPanel();
+        this.add(container, BorderLayout.NORTH);
+        container.setLayout(new BorderLayout());
+        container.add(BorderLayout.NORTH, toolBar);
+
+        rangeSliderModel = new DiagramViewModel(diagram.getGraph().getGroup(), filterChain, sequence);
+        rangeSliderModel.selectGraph(diagram.getGraph());
+        rangeSlider = new RangeSlider();
+        rangeSlider.setModel(rangeSliderModel);
+        rangeSliderModel.getChangedEvent().addListener(this);
+        container.add(BorderLayout.CENTER, rangeSlider);
+
+        scene = new DiagramScene(actions, rangeSliderModel);
+        content = new InstanceContent();
+        this.associateLookup(new ProxyLookup(new Lookup[]{scene.getLookup(), new AbstractLookup(content)}));
+        content.add(exportCookie);
+        content.add(rangeSliderModel);
+
+
+        findPanel = new FindPanel(diagram.getFigures());
+        findPanel.setMaximumSize(new Dimension(200, 50));
+        toolBar.add(findPanel);
+        toolBar.add(NodeFindAction.get(NodeFindAction.class));
+        toolBar.addSeparator();
+        toolBar.add(NextDiagramAction.get(NextDiagramAction.class));
+        toolBar.add(PrevDiagramAction.get(PrevDiagramAction.class));
+        toolBar.addSeparator();
+        toolBar.add(ExtractAction.get(ExtractAction.class));
+        toolBar.add(ShowAllAction.get(HideAction.class));
+        toolBar.add(ShowAllAction.get(ShowAllAction.class));
+        toolBar.addSeparator();
+        toolBar.add(ShowAllAction.get(ZoomInAction.class));
+        toolBar.add(ShowAllAction.get(ZoomOutAction.class));
+
+        blockLayoutAction = new EnableBlockLayoutAction();
+        JToggleButton button = new JToggleButton(blockLayoutAction);
+        button.setSelected(true);
+        toolBar.add(button);
+        blockLayoutAction.addPropertyChangeListener(this);
+
+        overviewAction = new OverviewAction();
+        overviewButton = new JToggleButton(overviewAction);
+        overviewButton.setSelected(false);
+        toolBar.add(overviewButton);
+        overviewAction.addPropertyChangeListener(this);
+
+        predSuccAction = new PredSuccAction();
+        button = new JToggleButton(predSuccAction);
+        button.setSelected(true);
+        toolBar.add(button);
+        predSuccAction.addPropertyChangeListener(this);
+
+        toolBar.addSeparator();
+        toolBar.add(UndoAction.get(UndoAction.class));
+        toolBar.add(RedoAction.get(RedoAction.class));
+
+        centerPanel = new JPanel();
+        this.add(centerPanel, BorderLayout.CENTER);
+        cardLayout = new CardLayout();
+        centerPanel.setLayout(cardLayout);
+        centerPanel.add(SCENE_STRING, scene.getScrollPane());
+        centerPanel.setBackground(Color.WHITE);
+        satelliteComponent = new ExtendedSatelliteComponent(scene);
+        satelliteComponent.setSize(200, 200);
+        centerPanel.add(SATELLITE_STRING, satelliteComponent);
+
+        CallbackSystemAction callFindAction = (CallbackSystemAction) SystemAction.get(FindAction.class);
+        NodeFindAction findAction = NodeFindAction.get(NodeFindAction.class);
+        Object key = callFindAction.getActionMapKey();
+        actionMap.put(key, findAction);
+
+        scene.getScrollPane().addKeyListener(keyListener);
+        scene.getView().addKeyListener(keyListener);
+        satelliteComponent.addKeyListener(keyListener);
+
+        scene.getScrollPane().addHierarchyBoundsListener(new HierarchyBoundsListener() {
+
+            public void ancestorMoved(HierarchyEvent e) {
+            }
+
+            public void ancestorResized(HierarchyEvent e) {
+                if (!notFirstTime && scene.getScrollPane().getBounds().width > 0) {
+                    notFirstTime = true;
+                    SwingUtilities.invokeLater(new Runnable() {
+
+                        public void run() {
+                            Figure f = EditorTopComponent.this.scene.getModel().getDiagramToView().getRootFigure();
+                            if (f != null) {
+                                scene.setUndoRedoEnabled(false);
+                                scene.gotoFigure(f);
+                                scene.setUndoRedoEnabled(true);
+                            }
+                        }
+                    });
+                }
+            }
+        });
+
+        updateDisplayName();
+    }
+    private KeyListener keyListener = new KeyListener() {
+
+        public void keyTyped(KeyEvent e) {
+        }
+
+        public void keyPressed(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_S) {
+                EditorTopComponent.this.overviewButton.setSelected(true);
+                EditorTopComponent.this.overviewAction.setState(true);
+            }
+        }
+
+        public void keyReleased(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_S) {
+                EditorTopComponent.this.overviewButton.setSelected(false);
+                EditorTopComponent.this.overviewAction.setState(false);
+            }
+        }
+    };
+
+    public DiagramViewModel getDiagramModel() {
+        return scene.getModel();
+    }
+
+    private void showSatellite() {
+        cardLayout.show(centerPanel, SATELLITE_STRING);
+        satelliteComponent.requestFocus();
+
+    }
+
+    private void showScene() {
+        cardLayout.show(centerPanel, SCENE_STRING);
+        scene.getView().requestFocus();
+    }
+
+    public void findNode() {
+        findPanel.find();
+    }
+
+    public void zoomOut() {
+        double zoom = scene.getZoomFactor();
+        Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+        double newZoom = zoom / DiagramScene.ZOOM_INCREMENT;
+        if (newZoom > DiagramScene.ZOOM_MIN_FACTOR) {
+            scene.setZoomFactor(newZoom);
+            scene.validate();
+            scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x / DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y / DiagramScene.ZOOM_INCREMENT)));
+            this.satelliteComponent.update();
+        }
+    }
+
+    public void zoomIn() {
+        double zoom = scene.getZoomFactor();
+        Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+        double newZoom = zoom * DiagramScene.ZOOM_INCREMENT;
+        if (newZoom < DiagramScene.ZOOM_MAX_FACTOR) {
+            scene.setZoomFactor(newZoom);
+            scene.validate();
+            scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x * DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y * DiagramScene.ZOOM_INCREMENT)));
+            this.satelliteComponent.update();
+        }
+    }
+
+    public void showPrevDiagram() {
+        int fp = getModel().getFirstPosition();
+        int sp = getModel().getSecondPosition();
+        if (fp != 0) {
+            fp--;
+            sp--;
+            getModel().setPositions(fp, sp);
+        }
+    }
+
+    public DiagramViewModel getModel() {
+        return scene.getModel();
+    }
+
+    public FilterChain getFilterChain() {
+        return this.scene.getModel().getFilterChain();
+    }
+
+    public static EditorTopComponent getActive() {
+        Set<? extends Mode> modes = WindowManager.getDefault().getModes();
+        for (Mode m : modes) {
+            TopComponent tc = m.getSelectedTopComponent();
+            if (tc instanceof EditorTopComponent) {
+                return (EditorTopComponent) tc;
+            }
+        }
+        return null;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+        private void initComponents() {
+                jCheckBox1 = new javax.swing.JCheckBox();
+
+                org.openide.awt.Mnemonics.setLocalizedText(jCheckBox1, "jCheckBox1");
+                jCheckBox1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+                jCheckBox1.setMargin(new java.awt.Insets(0, 0, 0, 0));
+
+                setLayout(new java.awt.BorderLayout());
+
+        }// </editor-fold>//GEN-END:initComponents
+        // Variables declaration - do not modify//GEN-BEGIN:variables
+        private javax.swing.JCheckBox jCheckBox1;
+        // End of variables declaration//GEN-END:variables
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_NEVER;
+    }
+
+    @Override
+    public void componentOpened() {
+    }
+
+    @Override
+    public void componentClosed() {
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public void changed(RangeSliderModel model) {
+        updateDisplayName();
+    }
+
+    public boolean showPredSucc() {
+        return (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+    }
+
+    public void setSelection(PropertyMatcher matcher) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(scene.getModel().getDiagramToView().getFigures());
+        List<Figure> list = selector.selectMultiple(matcher);
+        boolean b = scene.getUndoRedoEnabled();
+        scene.setUndoRedoEnabled(false);
+        scene.gotoFigures(list);
+        scene.setUndoRedoEnabled(b);
+        scene.setSelection(list);
+    }
+
+    public void setSelectedNodes(Set<InputNode> nodes) {
+
+        List<Figure> list = new ArrayList<Figure>();
+        Set<Integer> ids = new HashSet<Integer>();
+        for (InputNode n : nodes) {
+            ids.add(n.getId());
+        }
+
+        for (Figure f : scene.getModel().getDiagramToView().getFigures()) {
+            for (InputNode n : f.getSource().getSourceNodes()) {
+                if (ids.contains(n.getId())) {
+                    list.add(f);
+                    break;
+                }
+            }
+        }
+
+        scene.gotoFigures(list);
+        scene.setSelection(list);
+    }
+
+    public void propertyChange(PropertyChangeEvent evt) {
+        if (evt.getSource() == this.predSuccAction) {
+            boolean b = (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+            this.getModel().setShowNodeHull(b);
+        } else if (evt.getSource() == this.overviewAction) {
+            boolean b = (Boolean) overviewAction.getValue(OverviewAction.STATE);
+            if (b) {
+                showSatellite();
+            } else {
+                showScene();
+            }
+        } else if (evt.getSource() == this.blockLayoutAction) {
+            boolean b = (Boolean) blockLayoutAction.getValue(EnableBlockLayoutAction.STATE);
+            System.out.println("Showblocks = " + b);
+            this.getModel().setShowBlocks(b);
+        } else {
+            assert false : "Unknown event source";
+        }
+    }
+
+    public void extract() {
+        scene.showOnly(scene.getSelectedNodes());
+    }
+
+    public void hideNodes() {
+        Set<Integer> selectedNodes = this.scene.getSelectedNodes();
+        HashSet<Integer> nodes = new HashSet<Integer>(scene.getModel().getHiddenNodes());
+        nodes.addAll(selectedNodes);
+        this.scene.showNot(nodes);
+    }
+
+    public void expandPredecessors() {
+        Set<Figure> oldSelection = scene.getSelectedFigures();
+        Set<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+            boolean ok = false;
+            if (oldSelection.contains(f)) {
+                ok = true;
+            } else {
+                for (Figure pred : f.getSuccessors()) {
+                    if (oldSelection.contains(pred)) {
+                        ok = true;
+                        break;
+                    }
+                }
+            }
+
+            if (ok) {
+                figures.add(f);
+            }
+        }
+
+        scene.showAll(figures);
+    }
+
+    public void expandSuccessors() {
+        Set<Figure> oldSelection = scene.getSelectedFigures();
+        Set<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+            boolean ok = false;
+            if (oldSelection.contains(f)) {
+                ok = true;
+            } else {
+                for (Figure succ : f.getPredecessors()) {
+                    if (oldSelection.contains(succ)) {
+                        ok = true;
+                        break;
+                    }
+                }
+            }
+
+            if (ok) {
+                figures.add(f);
+            }
+        }
+
+        scene.showAll(figures);
+    }
+
+    public void showAll() {
+        scene.showNot(new HashSet<Integer>());
+    }
+
+    public Diagram getDiagram() {
+        return getDiagramModel().getDiagramToView();
+    }
+
+    @Override
+    protected void componentActivated() {
+    }
+
+    @Override
+    public void requestFocus() {
+        super.requestFocus();
+        scene.getView().requestFocus();
+    }
+
+    @Override
+    public boolean requestFocusInWindow() {
+        super.requestFocusInWindow();
+        return scene.getView().requestFocusInWindow();
+    }
+
+    @Override
+    public UndoRedo getUndoRedo() {
+        return scene.getUndoRedo();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java
new file mode 100644
index 0000000..539865e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.hotspot.igv.view;
+
+import java.io.File;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ExportCookie {
+
+    void export(File f);
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java
new file mode 100644
index 0000000..15ae321
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.action.WidgetAction;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedPanAction extends WidgetAction.LockedAdapter {
+
+    private Scene scene;
+    private JScrollPane scrollPane;
+    private Point lastLocation;
+
+    protected boolean isLocked() {
+        return scrollPane != null;
+    }
+
+    @Override
+    public State mousePressed(Widget widget, WidgetMouseEvent event) {
+        if (event.getButton() == MouseEvent.BUTTON2 || event.getButton() == MouseEvent.BUTTON1 && ((event.getModifiers() & MouseEvent.CTRL_MASK) != 0)) {
+            scene = widget.getScene();
+            scrollPane = findScrollPane(scene.getView());
+            if (scrollPane != null) {
+                lastLocation = scene.convertSceneToView(widget.convertLocalToScene(event.getPoint()));
+                SwingUtilities.convertPointToScreen(lastLocation, scrollPane.getViewport().getView());
+                return State.createLocked(widget, this);
+            }
+        }
+        return State.REJECTED;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+        boolean state = pan(widget, event.getPoint());
+        if (state) {
+            scrollPane = null;
+        }
+        return state ? State.createLocked(widget, this) : State.REJECTED;
+    }
+
+    @Override
+    public State mouseDragged(Widget widget, WidgetMouseEvent event) {
+        return pan(widget, event.getPoint()) ? State.createLocked(widget, this) : State.REJECTED;
+    }
+
+    private boolean pan(Widget widget, Point newLocation) {
+        if (scrollPane == null || scene != widget.getScene()) {
+            return false;
+        }
+        newLocation = scene.convertSceneToView(widget.convertLocalToScene(newLocation));
+        SwingUtilities.convertPointToScreen(newLocation, scrollPane.getViewport().getView());
+        Point viewPosition = scrollPane.getViewport().getViewPosition();
+        Dimension viewSize = scrollPane.getViewport().getViewSize();
+        Dimension viewPortSize = scrollPane.getViewport().getSize();
+
+        int xOffset = lastLocation.x - newLocation.x;
+        int yOffset = lastLocation.y - newLocation.y;
+
+        if (viewPortSize.height == viewSize.height) {
+            yOffset = 0;
+        }
+
+        if (viewPortSize.width == viewSize.width) {
+            xOffset = 0;
+        }
+
+        if (xOffset == 0 && yOffset == 0) {
+            return true;
+        }
+        viewPosition = new Point(viewPosition.x + xOffset, viewPosition.y + yOffset);
+        viewPosition.x = Math.max(viewPosition.x, 0);
+        viewPosition.y = Math.max(viewPosition.y, 0);
+        viewPosition.x = Math.min(viewPosition.x, scrollPane.getViewport().getView().getSize().width - scrollPane.getViewport().getSize().width);
+        viewPosition.y = Math.min(viewPosition.y, scrollPane.getViewport().getView().getSize().height - scrollPane.getViewport().getSize().height);
+
+        scrollPane.getViewport().setViewPosition(viewPosition);
+        scrollPane.getViewport().getView().repaint();
+        lastLocation = newLocation;
+        return true;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java
new file mode 100644
index 0000000..cd3e894
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+    private DiagramScene scene;
+    private Image image;
+    private int imageWidth;
+    private int imageHeight;
+
+    public ExtendedSatelliteComponent(DiagramScene scene) {
+        this.scene = scene;
+        setDoubleBuffered(true);
+        setPreferredSize(new Dimension(128, 128));
+        addMouseListener(this);
+        addMouseMotionListener(this);
+    }
+
+    public void addNotify() {
+        super.addNotify();
+        scene.addSceneListener(this);
+        JComponent viewComponent = scene.getView();
+        if (viewComponent == null) {
+            viewComponent = scene.createView();
+        }
+        viewComponent.addComponentListener(this);
+        repaint();
+    }
+
+    public void removeNotify() {
+        scene.getView().removeComponentListener(this);
+        scene.removeSceneListener(this);
+        super.removeNotify();
+    }
+
+    public void update() {
+        this.image = null;
+        if (this.isVisible()) {
+            repaint();
+            revalidate();
+            validate();
+        }
+    }
+
+    public void paint(Graphics g) {
+        Graphics2D gr = (Graphics2D) g;
+        super.paint(g);
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+
+        if (image == null || vw != imageWidth || vh != imageHeight) {
+
+            imageWidth = vw;
+            imageHeight = vh;
+            image = this.createImage(imageWidth, imageHeight);
+            Graphics2D ig = (Graphics2D) image.getGraphics();
+            ig.scale(scale, scale);
+            scene.setRealZoomFactor(scale);
+            scene.paint(ig);
+            scene.setRealZoomFactor(0.0);
+        }
+
+        gr.drawImage(image, vx, vy, this);
+
+        JComponent component = scene.getView();
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+        if (viewRectangle != null) {
+            Rectangle window = new Rectangle(
+                    (int) ((double) viewRectangle.x * scale / zoomFactor),
+                    (int) ((double) viewRectangle.y * scale / zoomFactor),
+                    (int) ((double) viewRectangle.width * scale / zoomFactor),
+                    (int) ((double) viewRectangle.height * scale / zoomFactor));
+            window.translate(vx, vy);
+            gr.setColor(new Color(200, 200, 200, 128));
+            gr.fill(window);
+            gr.setColor(Color.BLACK);
+            gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+        }
+    }
+
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    public void mousePressed(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseMoved(MouseEvent e) {
+    }
+
+    private void moveVisibleRect(Point center) {
+        JComponent component = scene.getView();
+        if (component == null) {
+            return;
+        }
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+        int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+        int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+        Rectangle visibleRect = component.getVisibleRect();
+        visibleRect.x = cx - visibleRect.width / 2;
+        visibleRect.y = cy - visibleRect.height / 2;
+        component.scrollRectToVisible(visibleRect);
+
+        this.repaint();
+    }
+
+    public void sceneRepaint() {
+    //repaint ();
+    }
+
+    public void sceneValidating() {
+    }
+
+    public void sceneValidated() {
+    }
+
+    public void componentResized(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentMoved(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentShown(ComponentEvent e) {
+    }
+
+    public void componentHidden(ComponentEvent e) {
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java
new file mode 100644
index 0000000..7d45f1b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import com.sun.hotspot.igv.data.Property;
+import java.awt.GridLayout;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+class FindPanel extends JPanel implements KeyListener {
+
+    private JComboBox nameComboBox;
+    private JTextField valueTextField;
+
+    public FindPanel(List<Figure> figures) {
+        createDesign();
+        updateComboBox(figures);
+    }
+
+    protected void createDesign() {
+        setLayout(new GridLayout());
+        nameComboBox = new JComboBox();
+        valueTextField = new JTextField();
+        add(nameComboBox);
+        add(valueTextField);
+        valueTextField.addKeyListener(this);
+    }
+
+    public void updateComboBox(List<Figure> figures) {
+
+        String sel = (String) nameComboBox.getSelectedItem();
+        SortedSet<String> propertyNames = new TreeSet<String>();
+
+        for (Figure f : figures) {
+            Properties prop = f.getProperties();
+            for (Property p : prop.getProperties()) {
+                if (!propertyNames.contains(p.getName())) {
+                    propertyNames.add(p.getName());
+                }
+            }
+        }
+
+        for (String s : propertyNames) {
+            nameComboBox.addItem(s);
+        }
+        nameComboBox.setSelectedItem(sel);
+    }
+
+    public String getNameText() {
+        return (String) nameComboBox.getSelectedItem();
+    }
+
+    public String getValueText() {
+        return valueTextField.getText();
+    }
+
+    public void keyTyped(KeyEvent e) {
+    }
+
+    public void keyPressed(KeyEvent e) {
+        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+            find();
+        }
+    }
+
+    public void find() {
+        EditorTopComponent comp = EditorTopComponent.getActive();
+        if (comp != null) {
+            RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(getNameText(), getValueText());
+            comp.setSelection(matcher);
+        }
+    }
+
+    public void keyReleased(KeyEvent e) {
+
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java
new file mode 100644
index 0000000..e303b51
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.settings.Settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphViewerImplementation implements GraphViewer {
+
+    public void view(InputGraph graph) {
+        Diagram diagram = Diagram.createDiagram(graph, Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+        EditorTopComponent tc = new EditorTopComponent(diagram);
+        tc.open();
+        tc.requestActive();
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java
new file mode 100644
index 0000000..31df010
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PreferenceConstants {
+
+    public static final String KEY_LINE_GENERATOR = "lineGenerator";
+    public static final String DEFAULT_LINE_GENERATOR = "com.sun.hotspot.igv.positioning.BasicLineGenerator";
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java
new file mode 100644
index 0000000..9176297
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Collection;
+import java.util.List;
+import org.netbeans.api.visual.layout.Layout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SlotLayout implements Layout {
+
+    public enum HorizontalAlignment {
+
+        Left,
+        Center,
+        Right
+    }
+    private Layout baseLayout;
+    private HorizontalAlignment alignment;
+    private boolean vertical;
+
+    public SlotLayout() {
+        this(HorizontalAlignment.Center, false);
+    }
+
+    public SlotLayout(HorizontalAlignment alignment, boolean vertical) {
+        this.alignment = alignment;
+        baseLayout = LayoutFactory.createVerticalFlowLayout();
+        this.vertical = vertical;
+    }
+
+    public void layout(Widget widget) {
+        if (!vertical) {
+            Collection<Widget> children = widget.getChildren();
+            int gap = 0;
+            int max = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int i = preferredBounds.width;
+                if (i > max) {
+                    max = i;
+                }
+            }
+            int pos = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int x = preferredBounds.x;
+                int y = preferredBounds.y;
+                int width = preferredBounds.width;
+                int height = preferredBounds.height;
+                if (pos == 0) {
+                    pos += height / 2;
+                }
+                int lx = -x;
+                int ly = pos - y;
+                switch (alignment) {
+                    case Center:
+                        lx += (max - width) / 2;
+                        break;
+                    case Left:
+                        break;
+                    case Right:
+                        lx += max - width;
+                        break;
+                }
+                child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+                pos += height + gap;
+            }
+        } else {
+
+            Collection<Widget> children = widget.getChildren();
+            int gap = 0;
+            int max = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int i = preferredBounds.height;
+                if (i > max) {
+                    max = i;
+                }
+            }
+            int pos = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int x = preferredBounds.x;
+                int y = preferredBounds.y;
+                int width = preferredBounds.width;
+                int height = preferredBounds.height;
+                if (pos == 0) {
+                    pos += width / 2;
+                }
+                int lx = pos - x;
+                int ly = -y;
+                switch (alignment) {
+                    case Center:
+                        ly += (max - height) / 2;
+                        break;
+                    case Left:
+                        break;
+                    case Right:
+                        ly += max - height;
+                        break;
+                }
+                child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+                pos += width + gap;
+            }
+
+        }
+    }
+
+    public boolean requiresJustification(Widget widget) {
+        return true;
+    }
+
+    public void justify(Widget widget) {
+        baseLayout.justify(widget);
+
+        Rectangle client = widget.getClientArea();
+        List<Widget> children = widget.getChildren();
+
+        int count = children.size();
+        int z = 0;
+
+        int maxWidth = 0;
+        for (Widget c : children) {
+            if (c.getPreferredBounds().width > maxWidth) {
+                maxWidth = c.getPreferredBounds().width;
+            }
+        }
+
+        for (Widget c : children) {
+            z++;
+            Point curLocation = c.getLocation();
+            Rectangle curBounds = c.getBounds();
+
+
+            Point location = new Point(curLocation.x, client.y + client.height * z / (count + 1) - curBounds.height / 2);
+            if (vertical) {
+                location = new Point(client.x + client.width * z / (count + 1) - maxWidth / 2, curLocation.y);
+            }
+            c.resolveBounds(location, null);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties
new file mode 100644
index 0000000..2f1fad5
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties
@@ -0,0 +1,7 @@
+CTL_EditorAction=Open Editor Window
+CTL_LineGeneratorAction=Line Generator
+CTL_NextDiagramAction=Show next graph
+CTL_EnableBlockLayoutAction=Enable block layout
+CTL_NodeFindAction=Find
+CTL_PrevDiagramAction=Show previous graph
+CTL_ExportAction=Export...
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java
new file mode 100644
index 0000000..231d5c1
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EnableBlockLayoutAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public EnableBlockLayoutAction() {
+        state = true;
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(STATE, true);
+        putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        this.state = !state;
+        this.putValue(STATE, state);
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/blocks.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java
new file mode 100644
index 0000000..3bb9dbe
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandPredecessorsAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.expandPredecessors();
+        }
+    }
+
+    public String getName() {
+        return "Expand Predecessors";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java
new file mode 100644
index 0000000..6ca1508
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandSuccessorsAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.expandSuccessors();
+        }
+    }
+
+    public String getName() {
+        return "Expand Successors";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java
new file mode 100644
index 0000000..771e25c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.view.ExportCookie;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExportAction extends CallableSystemAction implements LookupListener {
+
+    private final Lookup lookup;
+    private final Lookup.Result<ExportCookie> result;
+
+    public ExportAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Export current graph as an SVG file");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
+        lookup = Utilities.actionsGlobalContext();
+        result = lookup.lookup(new Lookup.Template<ExportCookie>(ExportCookie.class));
+        result.addLookupListener(this);
+        resultChanged(null);
+    }
+
+    public void resultChanged(LookupEvent e) {
+        super.setEnabled(result.allInstances().size() > 0);
+    }
+
+    public void performAction() {
+
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(new FileFilter() {
+
+            public boolean accept(File f) {
+                return true;
+            }
+
+            public String getDescription() {
+                return "SVG files (*.svg)";
+            }
+        });
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+
+        if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+            if (!file.getName().contains(".")) {
+                file = new File(file.getAbsolutePath() + ".svg");
+            }
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+            ExportCookie cookie = Utilities.actionsGlobalContext().lookup(ExportCookie.class);
+            if (cookie != null) {
+                cookie.export(file);
+            }
+        }
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(ExportAction.class, "CTL_ExportAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/export.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java
new file mode 100644
index 0000000..008ba3c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExtractAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.extract();
+        }
+    }
+
+    public ExtractAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Extract current set of selected nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Extract action";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/extract.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java
new file mode 100644
index 0000000..8ac2ffb
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class HideAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.hideNodes();
+        }
+    }
+
+    public HideAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Hide selected nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Hide";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/hide.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java
new file mode 100644
index 0000000..10afb7c
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import org.netbeans.api.visual.action.HoverProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MouseOverAction extends WidgetAction.Adapter {
+
+    private long eventID = Integer.MIN_VALUE;
+    private HoverProvider provider;
+
+    public MouseOverAction(HoverProvider provider) {
+        this.provider = provider;
+    }
+
+    @Override
+    public State mouseMoved(Widget widget, WidgetMouseEvent event) {
+        long id = event.getEventID();
+        if (id != eventID) {
+            eventID = id;
+            provider.widgetHovered(widget);
+        }
+        return State.REJECTED;
+    }
+
+    @Override
+    public State mouseExited(Widget widget, WidgetMouseEvent event) {
+        provider.widgetHovered(null);
+        return State.REJECTED;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java
new file mode 100644
index 0000000..d7f7216
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NextDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+    private DiagramViewModel model;
+
+    public NextDiagramAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public NextDiagramAction(Lookup lookup) {
+        putValue(Action.SHORT_DESCRIPTION, "Show next graph of current group");
+        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png")));
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(NextDiagramAction.class, "CTL_NextDiagramAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    public Class<DiagramViewModel> contextClass() {
+        return DiagramViewModel.class;
+    }
+
+    @Override
+    public void performAction(DiagramViewModel model) {
+        int fp = model.getFirstPosition();
+        int sp = model.getSecondPosition();
+        if (sp != model.getPositions().size() - 1) {
+            int nfp = fp + 1;
+            int nsp = sp + 1;
+            model.setPositions(nfp, nsp);
+        }
+    }
+
+    @Override
+    public void update(DiagramViewModel model) {
+        super.update(model);
+
+        if (this.model != model) {
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().removeListener(this);
+            }
+
+            this.model = model;
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().addListener(this);
+            }
+        }
+    }
+
+    @Override
+    public boolean isEnabled(DiagramViewModel model) {
+        return model.getSecondPosition() != model.getPositions().size() - 1;
+    }
+
+    public Action createContextAwareInstance(Lookup arg0) {
+        return new NextDiagramAction(arg0);
+    }
+
+    public void changed(DiagramViewModel source) {
+        update(source);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java
new file mode 100644
index 0000000..03911b0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NodeFindAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent comp = EditorTopComponent.getActive();
+        if (comp != null) {
+            comp.findNode();
+        }
+    }
+
+    public NodeFindAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Find nodes");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(NodeFindAction.class, "CTL_NodeFindAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/search.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java
new file mode 100644
index 0000000..0a54ca0
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OverviewAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public OverviewAction() {
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(Action.SHORT_DESCRIPTION, "Show satellite view of whole graph");
+        setState(false);
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        setState(!state);
+    }
+
+    public void setState(boolean b) {
+        this.putValue(STATE, b);
+        this.state = b;
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/overview.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java
new file mode 100644
index 0000000..6e2d79b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredSuccAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public PredSuccAction() {
+        state = true;
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(STATE, true);
+        putValue(Action.SHORT_DESCRIPTION, "Show neighboring nodes of fully visible nodes semi-transparent");
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        this.state = !state;
+        this.putValue(STATE, state);
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/predsucc.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java
new file mode 100644
index 0000000..2945c20
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class PrevDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+    private DiagramViewModel model;
+
+    public PrevDiagramAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public PrevDiagramAction(Lookup lookup) {
+        putValue(Action.SHORT_DESCRIPTION, "Show previous graph of current group");
+        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png")));
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(PrevDiagramAction.class, "CTL_PrevDiagramAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    public Class<DiagramViewModel> contextClass() {
+        return DiagramViewModel.class;
+    }
+
+    @Override
+    public void performAction(DiagramViewModel model) {
+        int fp = model.getFirstPosition();
+        int sp = model.getSecondPosition();
+        if (fp != 0) {
+            int nfp = fp - 1;
+            int nsp = sp - 1;
+            model.setPositions(nfp, nsp);
+        }
+    }
+
+    @Override
+    public void update(DiagramViewModel model) {
+        super.update(model);
+
+        if (this.model != model) {
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().removeListener(this);
+            }
+
+            this.model = model;
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().addListener(this);
+            }
+        }
+    }
+
+    @Override
+    public boolean isEnabled(DiagramViewModel model) {
+        return model.getFirstPosition() != 0;
+    }
+
+    public Action createContextAwareInstance(Lookup arg0) {
+        return new PrevDiagramAction(arg0);
+    }
+
+    public void changed(DiagramViewModel source) {
+        update(source);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java
new file mode 100644
index 0000000..f9f3b4b
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ShowAllAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.showAll();
+        }
+    }
+
+    public ShowAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Show all nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
+    }
+
+    public String getName() {
+        return "Show all";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/expand.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java
new file mode 100644
index 0000000..9b05972
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomInAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.zoomIn();
+        }
+    }
+
+    public String getName() {
+        return "Zoom in";
+    }
+
+    public ZoomInAction() {
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, Event.CTRL_MASK, false));
+        putValue(Action.SHORT_DESCRIPTION, "Zoom in");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/zoomin.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java
new file mode 100644
index 0000000..6ec6d24
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomOutAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.zoomOut();
+        }
+    }
+
+    public ZoomOutAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Zoom out");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Zoom out";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/zoomout.gif";
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif
new file mode 100644
index 0000000..71aa946
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif
new file mode 100644
index 0000000..ebc418d
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif
new file mode 100644
index 0000000..d15a80a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif
new file mode 100644
index 0000000..7a0f1aa
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif
new file mode 100644
index 0000000..25a0c0f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png
new file mode 100644
index 0000000..b0a40e6
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif
new file mode 100644
index 0000000..abafbe2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif
new file mode 100644
index 0000000..5009b34
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png
new file mode 100644
index 0000000..7eabfd9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif
new file mode 100644
index 0000000..9e48896
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif
new file mode 100644
index 0000000..2329426
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif
new file mode 100644
index 0000000..f9f7565
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml
new file mode 100644
index 0000000..eff917a
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-view-actions-ExportAction.instance">
+                <attr name="position" intvalue="1100"/>
+            </file>
+        </folder>
+        <folder name="View">
+            <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"><attr name="position" intvalue="2000"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ExtractAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-HideAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-OverviewAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-PredSuccAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-EnableBlockLayoutAction.instance"><attr name="position" intvalue="2001"/></file>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="View">
+            <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ShowAllAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ExtractAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ExtractAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-HideAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-HideAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomInAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"/>
+            </file>
+        </folder>
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-view-actions-ExportAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-view-actions-ExportAction.instance"/>
+                <attr name="position" intvalue="600"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Toolbars">
+        <folder name="Edit">
+            <attr name="com-sun-hotspot-igv-view-actions-LineGeneratorAction.shadow/com-sun-hotspot-igv-coordinator-actions-OpenGraphAction.shadow" boolvalue="true"/>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java
new file mode 100644
index 0000000..9465d25
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends Widget {
+
+    public static final int BORDER = 20;
+    public static final Color BACKGROUND_COLOR = new Color(235, 235, 255);
+    private static final Font titleFont = new Font("Serif", Font.PLAIN, 14).deriveFont(Font.BOLD);
+    private InputBlock blockNode;
+    private Diagram diagram;
+
+    public BlockWidget(Scene scene, Diagram d, InputBlock blockNode) {
+        super(scene);
+        this.blockNode = blockNode;
+        this.diagram = d;
+        this.setBackground(BACKGROUND_COLOR);
+        this.setOpaque(true);
+        this.setCheckClipping(true);
+    }
+
+    @Override
+    protected void paintWidget() {
+        super.paintWidget();
+        Graphics2D g = this.getGraphics();
+        Stroke old = g.getStroke();
+        g.setColor(Color.BLUE);
+        Rectangle r = new Rectangle(this.getPreferredBounds());
+        r.width--;
+        r.height--;
+        if (this.getBounds().width > 0 && this.getBounds().height > 0) {
+            g.setStroke(new BasicStroke(2));
+            g.drawRect(r.x, r.y, r.width, r.height);
+        }
+
+        Color titleColor = Color.BLACK;
+        g.setColor(titleColor);
+        g.setFont(titleFont);
+
+        String s = "B" + blockNode.toString();
+        Rectangle2D r1 = g.getFontMetrics().getStringBounds(s, g);
+        g.drawString(s, r.x + 5, r.y + (int) r1.getHeight());
+        g.setStroke(old);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java
new file mode 100644
index 0000000..98e6961
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.Scene;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramConnectionWidget extends ConnectionWidget {
+
+    private static Stroke DASHED_STROKE = new BasicStroke(
+            1,
+            BasicStroke.CAP_BUTT,
+            BasicStroke.JOIN_ROUND,
+            0,
+            new float[]{2},
+            0);
+    private static Stroke NORMAL_STROKE = new BasicStroke(1);
+    private static Stroke BOLD_STROKE = new BasicStroke(3);
+    public static int WHITE_FACTOR = 5;
+    private Connection connection;
+    private Color color;
+    private Point lastSourceAnchor;
+    private Point lastTargetAnchor;
+    private List<Point> controlPoints;
+    private Rectangle clientArea;
+    private boolean split;
+    private int[] xPoints;
+    private int[] yPoints;
+    private int pointCount;
+
+    /** Creates a new instance of ConnectionWidget */
+    public DiagramConnectionWidget(Connection connection, Scene scene) {
+        super(scene);
+        this.connection = connection;
+        color = connection.getColor();
+        if (connection.getStyle() == Connection.ConnectionStyle.DASHED) {
+            this.setStroke(DASHED_STROKE);
+        } else if (connection.getStyle() == Connection.ConnectionStyle.BOLD) {
+            this.setStroke(BOLD_STROKE);
+        } else {
+            this.setStroke(NORMAL_STROKE);
+        }
+        this.setCheckClipping(true);
+        clientArea = new Rectangle();
+        updateControlPoints();
+    }
+
+    public Connection getConnection() {
+        return connection;
+    }
+
+    public void updateControlPoints() {
+        List<Point> newControlPoints = connection.getControlPoints();
+        Connection c = connection;
+        Figure f = c.getInputSlot().getFigure();
+        Point p = new Point(f.getPosition());
+        p.translate(c.getInputSlot().getRelativePosition().x, f.getSize().height / 2);
+        Point p4 = new Point(f.getPosition());
+        p4.translate(c.getInputSlot().getRelativePosition().x, c.getInputSlot().getRelativePosition().y);
+
+        Figure f2 = c.getOutputSlot().getFigure();
+        Point p2 = new Point(f2.getPosition());
+        p2.translate(c.getOutputSlot().getRelativePosition().x, f2.getSize().height / 2);
+        Point p3 = new Point(f2.getPosition());
+        p3.translate(c.getOutputSlot().getRelativePosition().x, c.getOutputSlot().getRelativePosition().y);
+
+        /*if(controlPoints.size() >= 2) {
+        String className = Preferences.userNodeForPackage(PreferenceConstants.class).get(PreferenceConstants.KEY_LINE_GENERATOR, PreferenceConstants.DEFAULT_LINE_GENERATOR);
+        try {
+        LineGenerator lg = (LineGenerator)Class.forName(className).newInstance();
+        controlPoints = lg.createLine(controlPoints, p2, p);
+        } catch (InstantiationException ex) {
+        } catch (IllegalAccessException ex) {
+        } catch (ClassNotFoundException ex) {
+        }
+        }*/
+
+        this.controlPoints = newControlPoints;
+        pointCount = newControlPoints.size();
+        xPoints = new int[pointCount];
+        yPoints = new int[pointCount];
+        int minX = Integer.MAX_VALUE;
+        int maxX = Integer.MIN_VALUE;
+        int minY = Integer.MAX_VALUE;
+        int maxY = Integer.MIN_VALUE;
+        split = false;
+        for (int i = 0; i < pointCount; i++) {
+            if (newControlPoints.get(i) == null) {
+                split = true;
+            } else {
+                int curX = newControlPoints.get(i).x;
+                int curY = newControlPoints.get(i).y;
+                this.xPoints[i] = curX;
+                this.yPoints[i] = curY;
+                minX = Math.min(minX, curX);
+                maxX = Math.max(maxX, curX);
+                minY = Math.min(minY, curY);
+                maxY = Math.max(maxY, curY);
+            }
+        }
+
+        this.clientArea = new Rectangle(minX, minY, maxX - minX, maxY - minY);
+    }
+
+    @Override
+    protected void paintWidget() {
+        Graphics2D g = this.getGraphics();
+
+        if (xPoints.length == 0 || Math.abs(xPoints[0] - xPoints[xPoints.length - 1]) > 2000) {
+            return;
+        }
+
+        //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+        //g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
+        //g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+
+        DiagramScene ds = (DiagramScene) this.getScene();
+        boolean shouldHide = false;//ds.getShouldHide(this);
+
+        Composite oldComposite = null;
+        if (shouldHide) {
+            Color c = new Color(255 - (255 - color.getRed()) / WHITE_FACTOR, 255 - (255 - color.getGreen()) / WHITE_FACTOR, 255 - (255 - color.getBlue()) / WHITE_FACTOR);
+            g.setPaint(c);
+        } else {
+            g.setPaint(color);
+        }
+
+        if (split) {
+            for (int i = 1; i < controlPoints.size(); i++) {
+                Point prev = controlPoints.get(i - 1);
+                Point cur = controlPoints.get(i);
+                if (cur == null || prev == null) {
+                    continue;
+                }
+
+                g.drawLine(prev.x, prev.y, cur.x, cur.y);
+            }
+        } else {
+            g.drawPolyline(xPoints, yPoints, pointCount);
+        }
+
+        /*for(int i=0; i<xPoints.length; i++) {
+        int x = xPoints[i];
+        int y = yPoints[i];
+        g.fillOval(x - 2, y - 2, 4, 4);
+        }*/
+
+        if (xPoints.length >= 2) {
+            Graphics2D g2 = (Graphics2D) g.create();
+            int xOff = xPoints[xPoints.length - 2] - xPoints[xPoints.length - 1];
+            int yOff = yPoints[yPoints.length - 2] - yPoints[yPoints.length - 1];
+            if (xOff == 0 && yOff == 0 && yPoints.length >= 3) {
+                xOff = xPoints[xPoints.length - 3] - xPoints[xPoints.length - 1];
+                yOff = yPoints[yPoints.length - 3] - yPoints[yPoints.length - 1];
+            }
+            g2.translate(xPoints[xPoints.length - 1], yPoints[yPoints.length - 1]);
+            g2.rotate(Math.atan2(yOff, xOff));
+
+            g2.scale(0.55, 0.80);
+            AnchorShape.TRIANGLE_FILLED.paint(g2, false);
+        }
+    }
+
+    @Override
+    public void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+        if (previousState.isHovered() != state.isHovered()) {
+            color = connection.getColor();
+            if (state.isHovered()) {
+                this.setStroke(BOLD_STROKE);
+            } else {
+                this.setStroke(NORMAL_STROKE);
+            }
+
+            if (state.isHovered()) {
+                this.setStroke(BOLD_STROKE);
+            } else {
+                this.setStroke(NORMAL_STROKE);
+            }
+
+            repaint();
+        }
+        super.notifyStateChanged(previousState, state);
+    }
+
+    @Override
+    public List<Point> getControlPoints() {
+        if (split) {
+            ArrayList<Point> result = new ArrayList<Point>();
+            for (Point p : controlPoints) {
+                if (p != null) {
+                    result.add(p);
+                }
+            }
+            return result;
+        } else {
+            return controlPoints;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectionWidget[" + connection + "]";
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        Rectangle result = new Rectangle(clientArea);
+        result.grow(10, 10);
+        return result;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java
new file mode 100644
index 0000000..ea65e02
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import com.sun.hotspot.igv.view.SlotLayout;
+import com.sun.hotspot.igv.util.DoubleClickHandler;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FigureWidget extends Widget implements Properties.Provider, PopupMenuProvider, DoubleClickHandler {
+
+    public static final boolean VERTICAL_LAYOUT = true;
+    public static final int DEPTH = 5;
+    public static final int MAX_STRING_LENGTH = 20;
+    private static final double LABEL_ZOOM_FACTOR = 0.3;
+    private static final double ZOOM_FACTOR = 0.1;
+    private Font font;
+    private Font boldFont;
+    private Figure figure;
+    private Widget leftWidget;
+    private Widget rightWidget;
+    private Widget middleWidget;
+    private ArrayList<LabelWidget> labelWidgets;
+    private DiagramScene diagramScene;
+    private boolean boundary;
+    private Node node;
+
+    public void setBoundary(boolean b) {
+        boundary = b;
+    }
+
+    public boolean isBoundary() {
+        return boundary;
+    }
+
+    public Node getNode() {
+        return node;
+    }
+
+    private String shortenString(String string) {
+        if (string.length() > MAX_STRING_LENGTH) {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < string.length(); i++) {
+                char c = string.charAt(i);
+                if (!Character.isLetter(c) || Character.isUpperCase(c)) {
+                    sb.append(c);
+                }
+            }
+            string = sb.toString();
+        }
+        return string;
+    }
+
+    public FigureWidget(final Figure f, DiagramScene s, Widget parent) {
+
+        super(s);
+
+
+        font = f.getDiagram().getFont();
+        boldFont = f.getDiagram().getFont().deriveFont(Font.BOLD);
+        this.setCheckClipping(true);
+        this.diagramScene = s;
+
+        parent.addChild(this);
+        this.figure = f;
+        this.resolveBounds(null, calculateClientArea());
+
+        leftWidget = new Widget(s);
+        this.addChild(leftWidget);
+        leftWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Right, VERTICAL_LAYOUT));//LayoutFactory.createVerticalFlowLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+        middleWidget = new Widget(s);
+        this.addChild(middleWidget);
+
+        if (VERTICAL_LAYOUT) {
+            this.setLayout(LayoutFactory.createVerticalFlowLayout());
+        } else {
+            this.setLayout(LayoutFactory.createHorizontalFlowLayout());
+        }
+
+        middleWidget.setLayout(LayoutFactory.createVerticalFlowLayout());
+
+        middleWidget.setBackground(f.getColor());
+        middleWidget.setOpaque(true);
+        assert this.getScene() != null;
+        assert this.getScene().getView() != null;
+        middleWidget.setBorder(BorderFactory.createLineBorder(Color.BLACK));
+
+
+        labelWidgets = new ArrayList<LabelWidget>();
+
+        String[] strings = figure.getLines();
+
+        for (String cur : strings) {
+
+            String displayString = cur;
+
+            LabelWidget lw = new LabelWidget(s);
+            labelWidgets.add(lw);
+            middleWidget.addChild(lw);
+            lw.setLabel(displayString);
+
+            lw.setFont(font);
+            lw.setForeground(Color.BLACK);
+            lw.setAlignment(LabelWidget.Alignment.CENTER);
+            lw.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER);
+            lw.setMaximumSize(new Dimension(f.getWidth(), 20000));
+            lw.setMinimumSize(new Dimension(f.getWidth(), 20));
+        }
+
+        rightWidget = new Widget(s);
+        this.addChild(rightWidget);
+        rightWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Left, VERTICAL_LAYOUT));//LayoutFactory.createVerticalLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+        // Initialize node for property sheet
+        node = new AbstractNode(Children.LEAF) {
+
+            @Override
+            protected Sheet createSheet() {
+                Sheet s = super.createSheet();
+                PropertiesSheet.initializeSheet(f.getProperties(), s);
+                return s;
+            }
+        };
+        node.setDisplayName(getName());
+    }
+    private boolean firstTime = true;
+
+    @Override
+    protected void paintWidget() {
+        if (firstTime) {
+            firstTime = false;
+            for (LabelWidget w : labelWidgets) {
+                String cur = w.getLabel();
+                Graphics graphics = this.getGraphics();
+                if (graphics.getFontMetrics().stringWidth(cur) > figure.getWidth()) {
+                    w.setLabel(shortenString(cur));
+                }
+            }
+        }
+        super.paintWidget();
+    }
+
+    public Widget getLeftWidget() {
+        return leftWidget;
+    }
+
+    public Widget getRightWidget() {
+        return rightWidget;
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        super.notifyStateChanged(previousState, state);
+
+        Color borderColor = Color.BLACK;
+        int thickness = 1;
+        boolean repaint = false;
+        Font f = font;
+        if (state.isSelected()) {
+            thickness = 1;
+            f = boldFont;
+        }
+
+        if (state.isHovered()) {
+            borderColor = Color.BLUE;
+        }
+
+        if (state.isHovered() != previousState.isHovered()) {
+            repaint = true;
+        }
+
+        if (state.isSelected() != previousState.isSelected()) {
+            repaint = true;
+        }
+
+        if (repaint) {
+            middleWidget.setBorder(BorderFactory.createLineBorder(borderColor, thickness));
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setFont(f);
+            }
+            repaint();
+        }
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+
+    public Properties getProperties() {
+        return figure.getProperties();
+    }
+
+    public Figure getFigure() {
+        return figure;
+    }
+
+    @Override
+    protected void paintChildren() {
+
+        if (diagramScene.getRealZoomFactor() < ZOOM_FACTOR && diagramScene.getModel().getShowBlocks()) {
+            return;
+        }
+
+        Composite oldComposite = null;
+        if (boundary) {
+            oldComposite = getScene().getGraphics().getComposite();
+            float alpha = DiagramScene.ALPHA;
+            this.getScene().getGraphics().setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
+        }
+
+        if (diagramScene.getRealZoomFactor() < LABEL_ZOOM_FACTOR) {
+
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setVisible(false);
+            }
+            super.paintChildren();
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setVisible(true);
+            }
+
+        } else {
+            super.paintChildren();
+        }
+
+        if (boundary) {
+            getScene().getGraphics().setComposite(oldComposite);
+        }
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point point) {
+        JPopupMenu m = diagramScene.createPopupMenu();
+
+        JMenu predecessors = new JMenu("Predecessors");
+        addFigureToSubMenu(predecessors, getFigure(), false, DEPTH);
+
+        JMenu successors = new JMenu("Successors");
+        addFigureToSubMenu(successors, getFigure(), true, DEPTH);
+
+        m.addSeparator();
+        m.add(predecessors);
+        m.add(successors);
+        return m;
+    }
+
+    public void addFigureToSubMenu(JMenu subMenu, final Figure f, boolean successor, int depth) {
+        Set<Figure> set = f.getPredecessorSet();
+        if (successor) {
+            set = f.getSuccessorSet();
+        }
+
+        int count = set.size();
+        if (set.contains(f)) {
+            count--;
+        }
+
+        for (Figure f2 : set) {
+            if (f2 == f) {
+                continue;
+            }
+
+            count--;
+            addFigureToMenu(subMenu, f2, successor, depth - 1);
+            if (count > 0) {
+                subMenu.addSeparator();
+            }
+        }
+    }
+
+    public void addFigureToMenu(JMenu m, final Figure f, boolean successor, int depth) {
+
+        Action a = diagramScene.createGotoAction(f);
+
+
+        m.add(a);
+
+        if (depth > 0) {
+            String name = "Predecessors";
+            if (successor) {
+                name = "Successors";
+            }
+
+            JMenu subMenu = new JMenu(name);
+            addFigureToSubMenu(subMenu, f, successor, depth);
+            m.add(subMenu);
+        }
+
+    }
+
+    public void handleDoubleClick(Widget w, WidgetAction.WidgetMouseEvent e) {
+
+        if (diagramScene.isAllVisible()) {
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getGraphToView().getGroup().getAllNodes());
+            hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        } else if (isBoundary()) {
+
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+            hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        } else {
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+            hiddenNodes.addAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        }
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java
new file mode 100644
index 0000000..a6028aa
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlotWidget extends SlotWidget {
+
+    private InputSlot inputSlot;
+
+    public InputSlotWidget(InputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(slot, scene, parent, fw);
+        inputSlot = slot;
+        init();
+        getFigureWidget().getLeftWidget().addChild(this);
+    }
+
+    public InputSlot getInputSlot() {
+        return inputSlot;
+    }
+
+    protected Point calculateRelativeLocation() {
+        if (getFigureWidget().getBounds() == null) {
+            return new Point(0, 0);
+        }
+
+        double x = 0;
+        List<InputSlot> slots = inputSlot.getFigure().getInputSlots();
+        assert slots.contains(inputSlot);
+        return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(inputSlot))));
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java
new file mode 100644
index 0000000..902413e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LineWidget extends Widget implements PopupMenuProvider {
+
+    public final int BORDER = 8;
+    public final int ARROW_SIZE = 6;
+    public final int BOLD_ARROW_SIZE = 7;
+    public final int HOVER_ARROW_SIZE = 8;
+    public final int BOLD_STROKE_WIDTH = 2;
+    public final int HOVER_STROKE_WIDTH = 3;
+    private static double ZOOM_FACTOR = 0.1;
+    private OutputSlot outputSlot;
+    private DiagramScene scene;
+    private List<Connection> connections;
+    private Point from;
+    private Point to;
+    private Rectangle clientArea;
+    private Color color = Color.BLACK;
+    private LineWidget predecessor;
+    private List<LineWidget> successors;
+    private boolean highlighted;
+    private boolean popupVisible;
+    private boolean isBold;
+    private boolean isDashed;
+
+    public LineWidget(DiagramScene scene, OutputSlot s, List<Connection> connections, Point from, Point to, LineWidget predecessor, SceneAnimator animator, boolean isBold, boolean isDashed) {
+        super(scene);
+        this.scene = scene;
+        this.outputSlot = s;
+        this.connections = connections;
+        this.from = from;
+        this.to = to;
+        this.predecessor = predecessor;
+        this.successors = new ArrayList<LineWidget>();
+        if (predecessor != null) {
+            predecessor.addSuccessor(this);
+        }
+
+        this.isBold = isBold;
+        this.isDashed = isDashed;
+
+        int minX = from.x;
+        int minY = from.y;
+        int maxX = to.x;
+        int maxY = to.y;
+        if (minX > maxX) {
+            int tmp = minX;
+            minX = maxX;
+            maxX = tmp;
+        }
+
+        if (minY > maxY) {
+            int tmp = minY;
+            minY = maxY;
+            maxY = tmp;
+        }
+
+        clientArea = new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1);
+        clientArea.grow(BORDER, BORDER);
+
+        if (connections.size() > 0) {
+            color = connections.get(0).getColor();
+        }
+
+        this.setCheckClipping(true);
+
+        this.getActions().addAction(ActionFactory.createPopupMenuAction(this));
+        if (animator == null) {
+            this.setBackground(color);
+        } else {
+            this.setBackground(Color.WHITE);
+            animator.animateBackgroundColor(this, color);
+        }
+    }
+
+    public Point getFrom() {
+        return from;
+    }
+
+    public Point getTo() {
+        return to;
+    }
+
+    private void addSuccessor(LineWidget widget) {
+        this.successors.add(widget);
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return clientArea;
+    }
+
+    @Override
+    protected void paintWidget() {
+        if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+            return;
+        }
+
+        Graphics2D g = getScene().getGraphics();
+        g.setPaint(this.getBackground());
+        ObjectState state = this.getState();
+        float width = 1.0f;
+
+        if (isBold) {
+            width = BOLD_STROKE_WIDTH;
+        }
+
+        if (highlighted || popupVisible) {
+            width = HOVER_STROKE_WIDTH;
+        }
+
+        Stroke oldStroke = g.getStroke();
+        if (isDashed) {
+            float[] dashPattern = {5, 5, 5, 5};
+            g.setStroke(new BasicStroke(width, BasicStroke.CAP_BUTT,
+                    BasicStroke.JOIN_MITER, 10,
+                    dashPattern, 0));
+        } else {
+            g.setStroke(new BasicStroke(width));
+        }
+
+        g.drawLine(from.x, from.y, to.x, to.y);
+
+        boolean sameFrom = false;
+        boolean sameTo = successors.size() == 0;
+        for (LineWidget w : successors) {
+            if (w.getFrom().equals(getTo())) {
+                sameTo = true;
+            }
+        }
+
+        if (predecessor == null || predecessor.getTo().equals(getFrom())) {
+            sameFrom = true;
+        }
+
+
+        int size = ARROW_SIZE;
+        if (isBold) {
+            size = BOLD_ARROW_SIZE;
+        }
+        if (highlighted || popupVisible) {
+            size = HOVER_ARROW_SIZE;
+        }
+        if (!sameFrom) {
+            g.fillPolygon(
+                    new int[]{from.x - size / 2, from.x + size / 2, from.x},
+                    new int[]{from.y - size / 2, from.y - size / 2, from.y + size / 2},
+                    3);
+        }
+        if (!sameTo) {
+            g.fillPolygon(
+                    new int[]{to.x - size / 2, to.x + size / 2, to.x},
+                    new int[]{to.y - size / 2, to.y - size / 2, to.y + size / 2},
+                    3);
+        }
+        g.setStroke(oldStroke);
+    }
+
+    private void setHighlighted(boolean b) {
+        this.highlighted = b;
+        this.revalidate(true);
+    }
+
+    private void setPopupVisible(boolean b) {
+        this.popupVisible = b;
+        this.revalidate(true);
+    }
+
+    @Override
+    public boolean isHitAt(Point localPoint) {
+        return Line2D.ptLineDistSq(from.x, from.y, to.x, to.y, localPoint.x, localPoint.y) <= BORDER * BORDER;
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        if (previousState.isHovered() != state.isHovered()) {
+            setRecursiveHighlighted(state.isHovered());
+        }
+    }
+
+    private void setRecursiveHighlighted(boolean b) {
+        LineWidget cur = predecessor;
+        while (cur != null) {
+            cur.setHighlighted(b);
+            cur = cur.predecessor;
+        }
+
+        highlightSuccessors(b);
+        this.setHighlighted(b);
+    }
+
+    private void highlightSuccessors(boolean b) {
+        for (LineWidget s : successors) {
+            s.setHighlighted(b);
+            s.highlightSuccessors(b);
+        }
+    }
+
+    private void setRecursivePopupVisible(boolean b) {
+        LineWidget cur = predecessor;
+        while (cur != null) {
+            cur.setPopupVisible(b);
+            cur = cur.predecessor;
+        }
+
+        popupVisibleSuccessors(b);
+        setPopupVisible(b);
+    }
+
+    private void popupVisibleSuccessors(boolean b) {
+        for (LineWidget s : successors) {
+            s.setPopupVisible(b);
+            s.popupVisibleSuccessors(b);
+        }
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+        JPopupMenu menu = new JPopupMenu();
+        menu.add(scene.createGotoAction(outputSlot.getFigure()));
+        menu.addSeparator();
+
+        for (Connection c : connections) {
+            InputSlot s = c.getInputSlot();
+            menu.add(scene.createGotoAction(s.getFigure()));
+        }
+
+        final LineWidget w = this;
+        menu.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                w.setRecursivePopupVisible(true);
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                w.setRecursivePopupVisible(false);
+            }
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+            }
+        });
+
+        return menu;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java
new file mode 100644
index 0000000..b65c5ea
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MultiConnectionWidget extends Widget implements PopupMenuProvider {
+
+    public final int BORDER = 4;
+    public final int HOVER_STROKE_WIDTH = 3;
+
+    private static class Route {
+
+        public Point from;
+        public Point to;
+        public SortedSet<InputSlot> inputSlots;
+        public boolean decorateStart;
+        public boolean decorateEnd;
+
+        public Route(Point from, Point to) {
+            assert from != null;
+            assert to != null;
+            this.from = from;
+            this.to = to;
+            this.inputSlots = new TreeSet<InputSlot>();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+
+            if (obj instanceof Route) {
+                Route r = (Route) obj;
+                return r.from.equals(from) && r.to.equals(to);
+            }
+
+            return super.equals(obj);
+        }
+
+        @Override
+        public int hashCode() {
+            return ((((from.x * 1711) + from.y) * 1711 + to.x) * 1711 + to.y);
+        }
+    }
+    private Rectangle clientArea;
+    private OutputSlot outputSlot;
+    private Map<Route, SortedSet<InputSlot>> routeMap;
+    private List<Route> routeList;
+    private Color color;
+    private DiagramScene diagramScene;
+    private boolean popupVisible;
+
+    /** Creates a new instance of MultiConnectionWidget */
+    public MultiConnectionWidget(OutputSlot outputSlot, DiagramScene scene) {
+        super(scene);
+
+        this.diagramScene = scene;
+        this.outputSlot = outputSlot;
+        this.setCheckClipping(true);
+
+        routeMap = new HashMap<Route, SortedSet<InputSlot>>();
+        routeList = new ArrayList<Route>();
+        color = Color.BLACK;
+
+        for (Connection c : outputSlot.getConnections()) {
+            List<Point> controlPoints = c.getControlPoints();
+            InputSlot inputSlot = (InputSlot) c.getTo();
+            color = c.getColor();
+
+            for (int i = 1; i < controlPoints.size(); i++) {
+                Point prev = controlPoints.get(i - 1);
+                Point cur = controlPoints.get(i);
+
+                if (prev != null && cur != null) {
+                    Route r = new Route(prev, cur);
+                    if (routeMap.containsKey(r)) {
+                        SortedSet<InputSlot> set = routeMap.get(r);
+                        set.add(inputSlot);
+                    } else {
+                        SortedSet<InputSlot> set = new TreeSet<InputSlot>(Slot.slotFigureComparator);
+                        set.add(inputSlot);
+                        routeMap.put(r, set);
+                        routeList.add(r);
+                    }
+                }
+            }
+        }
+
+        if (routeList.size() == 0) {
+            clientArea = new Rectangle();
+        } else {
+            for (Route r : routeList) {
+
+                int x = r.from.x;
+                int y = r.from.y;
+
+                int x2 = r.to.x;
+                int y2 = r.to.y;
+
+                if (x > x2) {
+                    int tmp = x;
+                    x = x2;
+                    x2 = tmp;
+                }
+
+                if (y > y2) {
+                    int tmp = y;
+                    y = y2;
+                    y2 = tmp;
+                }
+
+                int width = x2 - x + 1;
+                int height = y2 - y + 1;
+
+                Rectangle rect = new Rectangle(x, y, width, height);
+                if (clientArea == null) {
+                    clientArea = rect;
+                } else {
+                    clientArea = clientArea.union(rect);
+                }
+            }
+
+            clientArea.grow(BORDER, BORDER);
+        }
+    }
+
+    private void setHoverPosition(Point location) {
+        Route r = getNearest(location);
+    }
+
+    private Route getNearest(Point localLocation) {
+
+        double minDist = Double.MAX_VALUE;
+        Route result = null;
+        for (Route r : routeList) {
+            double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+            if (dist < minDist) {
+                result = r;
+                minDist = dist;
+            }
+        }
+
+        assert result != null;
+
+        return result;
+    }
+
+    @Override
+    public boolean isHitAt(Point localLocation) {
+        if (!super.isHitAt(localLocation)) {
+            return false;
+        }
+
+        for (Route r : routeList) {
+            double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+            if (dist < BORDER * BORDER) {
+                setHoverPosition(localLocation);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return clientArea;
+    }
+
+    @Override
+    protected void paintWidget() {
+        Graphics2D g = getScene().getGraphics();
+        //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+        g.setColor(this.color);
+        ObjectState state = this.getState();
+        float width = 1.0f;
+        if (state.isHovered() || this.popupVisible) {
+            width = HOVER_STROKE_WIDTH;
+        }
+
+        Stroke oldStroke = g.getStroke();
+        g.setStroke(new BasicStroke(width));
+        for (Route r : routeList) {
+            g.drawLine(r.from.x, r.from.y, r.to.x, r.to.y);
+        }
+        g.setStroke(oldStroke);
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+        boolean repaint = false;
+
+        if (state.isHovered() != previousState.isHovered()) {
+            repaint = true;
+        }
+
+        repaint();
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+        JPopupMenu menu = new JPopupMenu();
+        Route r = getNearest(localLocation);
+        assert r != null;
+        assert routeMap.containsKey(r);
+
+        menu.add(diagramScene.createGotoAction(outputSlot.getFigure()));
+        menu.addSeparator();
+
+        SortedSet<InputSlot> set = this.routeMap.get(r);
+        for (InputSlot s : set) {
+            menu.add(diagramScene.createGotoAction(s.getFigure()));
+        }
+
+        final MultiConnectionWidget w = this;
+        menu.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                w.popupVisible = true;
+                w.repaint();
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                w.popupVisible = false;
+                w.repaint();
+            }
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+            }
+        });
+
+        return menu;
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java
new file mode 100644
index 0000000..351e6dd
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlotWidget extends SlotWidget {
+
+    private OutputSlot outputSlot;
+
+    public OutputSlotWidget(OutputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(slot, scene, parent, fw);
+        outputSlot = slot;
+        init();
+        getFigureWidget().getRightWidget().addChild(this);
+    }
+
+    public OutputSlot getOutputSlot() {
+        return outputSlot;
+    }
+
+    protected Point calculateRelativeLocation() {
+        if (getFigureWidget().getBounds() == null) {
+            return new Point(0, 0);
+        }
+
+        double x = this.getFigureWidget().getBounds().width;
+        List<OutputSlot> slots = outputSlot.getFigure().getOutputSlots();
+        assert slots.contains(outputSlot);
+        return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(outputSlot))));
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java
new file mode 100644
index 0000000..d5aac2f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.*;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class SlotWidget extends Widget {
+
+    private Slot slot;
+    private FigureWidget figureWidget;
+    private Image bufferImage;
+    private static double TEXT_ZOOM_FACTOR = 0.9;
+    private static double ZOOM_FACTOR = 0.6;
+    private DiagramScene scene;
+
+    public SlotWidget(Slot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(scene);
+        this.scene = scene;
+        this.slot = slot;
+        figureWidget = fw;
+        this.setToolTipText("<HTML>" + slot.getName() + "</HTML>");
+        this.setCheckClipping(true);
+    }
+
+    public Point getAnchorPosition() {
+        Point p = new Point(figureWidget.getFigure().getPosition());
+        Point p2 = slot.getRelativePosition();
+        p.translate(p2.x, p2.y);
+        return p;
+    }
+
+    protected void init() {
+
+        Point p = calculateRelativeLocation();
+        Rectangle r = calculateClientArea();
+        p = new Point(p.x, p.y - r.height / 2);
+        this.setPreferredLocation(p);
+    }
+
+    public Slot getSlot() {
+        return slot;
+    }
+
+    public FigureWidget getFigureWidget() {
+        return figureWidget;
+    }
+
+    @Override
+    protected void paintWidget() {
+
+        if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+            return;
+        }
+
+        if (bufferImage == null) {
+            Graphics2D g = this.getGraphics();
+            g.setColor(Color.DARK_GRAY);
+            int w = this.getBounds().width;
+            int h = this.getBounds().height;
+
+            if (getSlot().getShortName() != null && getSlot().getShortName().length() > 0 && scene.getRealZoomFactor() >= TEXT_ZOOM_FACTOR) {
+                Font f = new Font("Arial", Font.PLAIN, 8);
+                g.setFont(f.deriveFont(7.5f));
+                Rectangle2D r1 = g.getFontMetrics().getStringBounds(getSlot().getShortName(), g);
+                g.drawString(getSlot().getShortName(), (int) (this.getBounds().width - r1.getWidth()) / 2, (int) (this.getBounds().height + r1.getHeight()) / 2);
+            } else {
+
+                if (slot instanceof OutputSlot) {
+                    g.fillArc(w / 4, -h / 4 - 1, w / 2, h / 2, 180, 180);
+                } else {
+                    g.fillArc(w / 4, 3 * h / 4, w / 2, h / 2, 0, 180);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return new Rectangle(0, 0, Figure.SLOT_WIDTH, Figure.SLOT_WIDTH);
+    }
+
+    protected abstract Point calculateRelativeLocation();
+
+    protected double calculateRelativeY(int size, int index) {
+        assert index >= 0 && index < size;
+        assert size > 0;
+        double height = getFigureWidget().getBounds().getHeight();
+        return height * (index + 1) / (size + 1);
+    }
+}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
new file mode 100644
index 0000000..196dde4
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties
@@ -0,0 +1,7 @@
+currentVersion=IdealGraphVisualizer {0}
+LBL_splash_window_title=Starting IdealGraphVisualizer
+SPLASH_WIDTH=475
+SplashProgressBarBounds=0,268,473,6
+SplashProgressBarColor=0xFFFFFF
+SplashRunningTextBounds=269,253,205,12
+SplashRunningTextColor=0xFFFFFF
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif
new file mode 100644
index 0000000..43353c9
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif
new file mode 100644
index 0000000..949861e
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif
Binary files differ
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
new file mode 100644
index 0000000..1263cad
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties
@@ -0,0 +1,2 @@
+CTL_MainWindow_Title=IdealGraphVisualizer {0}
+CTL_MainWindow_Title_No_Project=IdealGraphVisualizer {0}
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/build.xml b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml
new file mode 100644
index 0000000..fb95e5f
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="IdealGraphVisualizer" basedir=".">
+    <description>Builds the module suite IdealGraphVisualizer.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml
new file mode 100644
index 0000000..f056e10
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="IdealGraphVisualizer-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
+    <property file="nbproject/private/platform-private.properties"/>
+    <property file="nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
+    <sproject:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/suite.xml"/>
+</project>
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties
new file mode 100644
index 0000000..758cede
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=72833581
+build.xml.script.CRC32=e9c757c5
+build.xml.stylesheet.CRC32=531c622b
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=72833581
+nbproject/build-impl.xml.script.CRC32=1b6f3648
+nbproject/build-impl.xml.stylesheet.CRC32=196c7090
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties
new file mode 100644
index 0000000..4768730
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=default
+nbplatform.active=default
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties
new file mode 100644
index 0000000..1b524d2
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties
@@ -0,0 +1,40 @@
+app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif
+app.name=idealgraphvisualizer
+app.title=IdealGraphVisualizer
+branding.token=${app.name}
+modules=\
+    ${project.com.sun.hotspot.igv.graph}:\
+    ${project.com.sun.hotspot.igv.coordinator}:\
+    ${project.com.sun.hotspot.igv.filter}:\
+    ${project.com.sun.hotspot.igv.hierarchicallayout}:\
+    ${project.com.sun.hotspot.igv.layout}:\
+    ${project.com.sun.hotspot.igv.controlflow}:\
+    ${project.com.sun.hotspot.igv.data}:\
+    ${project.com.sun.hotspot.igv.view}:\
+    ${project.com.sun.hotspot.igv.bytecodes}:\
+    ${project.com.sun.hotspot.igv.difference}:\
+    ${project.com.sun.hotspot.igv.settings}:\
+    ${project.com.sun.hotspot.igv.util}:\
+    ${project.com.sun.hotspot.igv.rhino}:\
+    ${project.com.sun.hotspot.igv.svg}:\
+    ${project.com.sun.hotspot.connection}:\
+    ${project.com.sun.hotspot.igv.servercompilerscheduler}:\
+    ${project.com.sun.hotspot.igv.filterwindow}
+project.com.sun.hotspot.connection=NetworkConnection
+project.com.sun.hotspot.igv.bytecodes=Bytecodes
+project.com.sun.hotspot.igv.controlflow=ControlFlow
+project.com.sun.hotspot.igv.coordinator=Coordinator
+project.com.sun.hotspot.igv.data=Data
+project.com.sun.hotspot.igv.difference=Difference
+project.com.sun.hotspot.igv.filter=Filter
+project.com.sun.hotspot.igv.filterwindow=FilterWindow
+project.com.sun.hotspot.igv.graph=Graph
+project.com.sun.hotspot.igv.hierarchicallayout=HierarchicalLayout
+project.com.sun.hotspot.igv.layout=Layout
+project.com.sun.hotspot.igv.rhino=RhinoScriptEngineProxy
+project.com.sun.hotspot.igv.servercompilerscheduler=ServerCompiler
+project.com.sun.hotspot.igv.settings=Settings
+project.com.sun.hotspot.igv.svg=BatikSVGProxy
+project.com.sun.hotspot.igv.view=View
+project.com.sun.hotspot.igv.util=Util
+run.args = -server -J-Xms64m -J-Xmx512m -J-da
diff --git a/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml
new file mode 100644
index 0000000..4740021
--- /dev/null
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project.suite</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-suite-project/1">
+            <name>IdealGraphVisualizer</name>
+        </data>
+    </configuration>
+</project>
diff --git a/hotspot/src/share/tools/MakeDeps/Database.java b/hotspot/src/share/tools/MakeDeps/Database.java
index c26ef1d..5cec93b 100644
--- a/hotspot/src/share/tools/MakeDeps/Database.java
+++ b/hotspot/src/share/tools/MakeDeps/Database.java
@@ -36,6 +36,7 @@
   private FileList outerFiles;
   private FileList indivIncludes;
   private FileList grandInclude; // the results for the grand include file
+  private HashMap<String,String> platformDepFiles;
   private long threshold;
   private int nOuterFiles;
   private int nPrecompiledFiles;
@@ -57,6 +58,7 @@
     outerFiles      = new FileList("outerFiles", plat);
     indivIncludes   = new FileList("IndivIncludes", plat);
     grandInclude    = new FileList(plat.getGIFileTemplate().nameOfList(), plat);
+    platformDepFiles = new HashMap<String,String>();
 
     threshold = t;
     nOuterFiles = 0;
@@ -209,6 +211,10 @@
               FileList p = allFiles.listForFile(includer);
               p.setPlatformDependentInclude(pdName.dirPreStemSuff());
 
+              // Record the implicit include of this file so that the
+              // dependencies for precompiled headers can mention it.
+              platformDepFiles.put(newIncluder, includer);
+
               // Add an implicit dependency on platform
               // specific file for the generic file
 
@@ -408,6 +414,12 @@
       for (Iterator iter = grandInclude.iterator(); iter.hasNext(); ) {
         FileList list = (FileList) iter.next();
         gd.println(list.getName() + " \\");
+        String platformDep = platformDepFiles.get(list.getName());
+        if (platformDep != null) {
+            // make sure changes to the platform dependent file will
+            // cause regeneration of the pch file.
+            gd.println(platformDep + " \\");
+        }
       }
       gd.println();
       gd.println();
diff --git a/hotspot/src/share/vm/adlc/adlc.hpp b/hotspot/src/share/vm/adlc/adlc.hpp
index fc81ee0..14bc5d6 100644
--- a/hotspot/src/share/vm/adlc/adlc.hpp
+++ b/hotspot/src/share/vm/adlc/adlc.hpp
@@ -29,11 +29,7 @@
 // standard library constants
 #include "stdio.h"
 #include "stdlib.h"
-#if _MSC_VER >= 1300  // Visual C++ 7.0 or later
 #include <iostream>
-#else
-#include <iostream.h>
-#endif
 #include "string.h"
 #include "ctype.h"
 #include "stdarg.h"
diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp
index fa84e09..fdfa985 100644
--- a/hotspot/src/share/vm/adlc/filebuff.hpp
+++ b/hotspot/src/share/vm/adlc/filebuff.hpp
@@ -23,13 +23,9 @@
  */
 
 // FILEBUFF.HPP - Definitions for parser file buffering routines
-
-#if _MSC_VER >= 1300  // Visual C++ 7.0 or later
 #include <iostream>
-#else
-#include <iostream.h>
-#endif
 
+using namespace std;
 // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES
 typedef struct {
   const char *_name;
diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp
index 1be50b3..47fe6ae 100644
--- a/hotspot/src/share/vm/adlc/formssel.cpp
+++ b/hotspot/src/share/vm/adlc/formssel.cpp
@@ -729,6 +729,7 @@
         !strcmp(_matrule->_rChild->_opType,"DecodeN")    ||
         !strcmp(_matrule->_rChild->_opType,"EncodeP")    ||
         !strcmp(_matrule->_rChild->_opType,"LoadN")      ||
+        !strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
         !strcmp(_matrule->_rChild->_opType,"CreateEx")   ||  // type of exception
         !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
   else if ( is_ideal_load() == Form::idealP )                return true;
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
index 80fee1a..ae516b7 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
@@ -1004,6 +1004,9 @@
 
   DEBUG_ONLY(mark_bitmap()->verify_clear();)
   DEBUG_ONLY(summary_data().verify_clear();)
+
+  // Have worker threads release resources the next time they run a task.
+  gc_task_manager()->release_all_resources();
 }
 
 void PSParallelCompact::post_compact()
@@ -1949,12 +1952,6 @@
   TimeStamp compaction_start;
   TimeStamp collection_exit;
 
-  // "serial_CM" is needed until the parallel implementation
-  // of the move and update is done.
-  ParCompactionManager* serial_CM = new ParCompactionManager();
-  // Don't initialize more than once.
-  // serial_CM->initialize(&summary_data(), mark_bitmap());
-
   ParallelScavengeHeap* heap = gc_heap();
   GCCause::Cause gc_cause = heap->gc_cause();
   PSYoungGen* young_gen = heap->young_gen();
@@ -1969,6 +1966,10 @@
   PreGCValues pre_gc_values;
   pre_compact(&pre_gc_values);
 
+  // Get the compaction manager reserved for the VM thread.
+  ParCompactionManager* const vmthread_cm =
+    ParCompactionManager::manager_array(gc_task_manager()->workers());
+
   // Place after pre_compact() where the number of invocations is incremented.
   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
 
@@ -2008,7 +2009,7 @@
     bool marked_for_unloading = false;
 
     marking_start.update();
-    marking_phase(serial_CM, maximum_heap_compaction);
+    marking_phase(vmthread_cm, maximum_heap_compaction);
 
 #ifndef PRODUCT
     if (TraceParallelOldGCMarkingPhase) {
@@ -2039,7 +2040,7 @@
 #endif
 
     bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
-    summary_phase(serial_CM, maximum_heap_compaction || max_on_system_gc);
+    summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
 
 #ifdef ASSERT
     if (VerifyParallelOldWithMarkSweep &&
@@ -2067,13 +2068,13 @@
       // code can use the the forwarding pointers to
       // check the new pointer calculation.  The restore_marks()
       // has to be done before the real compact.
-      serial_CM->set_action(ParCompactionManager::VerifyUpdate);
-      compact_perm(serial_CM);
-      compact_serial(serial_CM);
-      serial_CM->set_action(ParCompactionManager::ResetObjects);
-      compact_perm(serial_CM);
-      compact_serial(serial_CM);
-      serial_CM->set_action(ParCompactionManager::UpdateAndCopy);
+      vmthread_cm->set_action(ParCompactionManager::VerifyUpdate);
+      compact_perm(vmthread_cm);
+      compact_serial(vmthread_cm);
+      vmthread_cm->set_action(ParCompactionManager::ResetObjects);
+      compact_perm(vmthread_cm);
+      compact_serial(vmthread_cm);
+      vmthread_cm->set_action(ParCompactionManager::UpdateAndCopy);
 
       // For debugging only
       PSMarkSweep::restore_marks();
@@ -2084,16 +2085,14 @@
     compaction_start.update();
     // Does the perm gen always have to be done serially because
     // klasses are used in the update of an object?
-    compact_perm(serial_CM);
+    compact_perm(vmthread_cm);
 
     if (UseParallelOldGCCompacting) {
       compact();
     } else {
-      compact_serial(serial_CM);
+      compact_serial(vmthread_cm);
     }
 
-    delete serial_CM;
-
     // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
     // done before resizing.
     post_compact();
diff --git a/hotspot/src/share/vm/includeDB_compiler2 b/hotspot/src/share/vm/includeDB_compiler2
index 306281c..1d2cb6d 100644
--- a/hotspot/src/share/vm/includeDB_compiler2
+++ b/hotspot/src/share/vm/includeDB_compiler2
@@ -1084,6 +1084,7 @@
 idealGraphPrinter.hpp                   vectset.hpp
 idealGraphPrinter.hpp                   growableArray.hpp
 idealGraphPrinter.hpp                   ostream.hpp
+idealGraphPrinter.hpp                   xmlstream.hpp
 
 idealGraphPrinter.cpp                   idealGraphPrinter.hpp
 idealGraphPrinter.cpp                   chaitin.hpp
diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp
index 4b2da9b8..5f32640 100644
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp
@@ -196,6 +196,8 @@
   assert(_whole_heap.contains(new_region),
            "attempt to cover area not in reserved area");
   debug_only(verify_guard();)
+  // collided is true if the expansion would push into another committed region
+  debug_only(bool collided = false;)
   int const ind = find_covering_region_by_base(new_region.start());
   MemRegion const old_region = _covered[ind];
   assert(old_region.start() == new_region.start(), "just checking");
@@ -211,12 +213,36 @@
     }
     // Align the end up to a page size (starts are already aligned).
     jbyte* const new_end = byte_after(new_region.last());
-    HeapWord* const new_end_aligned =
+    HeapWord* new_end_aligned =
       (HeapWord*) align_size_up((uintptr_t)new_end, _page_size);
     assert(new_end_aligned >= (HeapWord*) new_end,
            "align up, but less");
+    int ri = 0;
+    for (ri = 0; ri < _cur_covered_regions; ri++) {
+      if (ri != ind) {
+        if (_committed[ri].contains(new_end_aligned)) {
+          assert((new_end_aligned >= _committed[ri].start()) &&
+                 (_committed[ri].start() > _committed[ind].start()),
+                 "New end of committed region is inconsistent");
+          new_end_aligned = _committed[ri].start();
+          assert(new_end_aligned > _committed[ind].start(),
+            "New end of committed region is before start");
+          debug_only(collided = true;)
+          // Should only collide with 1 region
+          break;
+        }
+      }
+    }
+#ifdef ASSERT
+    for (++ri; ri < _cur_covered_regions; ri++) {
+      assert(!_committed[ri].contains(new_end_aligned),
+        "New end of committed region is in a second committed region");
+    }
+#endif
     // The guard page is always committed and should not be committed over.
-    HeapWord* const new_end_for_commit = MIN2(new_end_aligned, _guard_region.start());
+    HeapWord* const new_end_for_commit = MIN2(new_end_aligned,
+                                              _guard_region.start());
+
     if (new_end_for_commit > cur_committed.end()) {
       // Must commit new pages.
       MemRegion const new_committed =
@@ -239,9 +265,11 @@
       if (!uncommit_region.is_empty()) {
         if (!os::uncommit_memory((char*)uncommit_region.start(),
                                  uncommit_region.byte_size())) {
-          // Do better than this for Merlin
-          vm_exit_out_of_memory(uncommit_region.byte_size(),
-            "card table contraction");
+          assert(false, "Card table contraction failed");
+          // The call failed so don't change the end of the
+          // committed region.  This is better than taking the
+          // VM down.
+          new_end_aligned = _committed[ind].end();
         }
       }
     }
@@ -257,8 +285,25 @@
     }
     assert(index_for(new_region.last()) < (int) _guard_index,
       "The guard card will be overwritten");
-    jbyte* const end = byte_after(new_region.last());
+    // This line commented out cleans the newly expanded region and
+    // not the aligned up expanded region.
+    // jbyte* const end = byte_after(new_region.last());
+    jbyte* const end = (jbyte*) new_end_for_commit;
+    assert((end >= byte_after(new_region.last())) || collided,
+      "Expect to be beyond new region unless impacting another region");
     // do nothing if we resized downward.
+#ifdef ASSERT
+    for (int ri = 0; ri < _cur_covered_regions; ri++) {
+      if (ri != ind) {
+        // The end of the new committed region should not
+        // be in any existing region unless it matches
+        // the start of the next region.
+        assert(!_committed[ri].contains(end) ||
+               (_committed[ri].start() == (HeapWord*) end),
+               "Overlapping committed regions");
+      }
+    }
+#endif
     if (entry < end) {
       memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte)));
     }
diff --git a/hotspot/src/share/vm/oops/symbolKlass.cpp b/hotspot/src/share/vm/oops/symbolKlass.cpp
index 6873251..d0b6e2f 100644
--- a/hotspot/src/share/vm/oops/symbolKlass.cpp
+++ b/hotspot/src/share/vm/oops/symbolKlass.cpp
@@ -209,10 +209,7 @@
 
 void symbolKlass::oop_print_on(oop obj, outputStream* st) {
   st->print("Symbol: '");
-  symbolOop sym = symbolOop(obj);
-  for (int i = 0; i < sym->utf8_length(); i++) {
-    st->print("%c", sym->byte_at(i));
-  }
+  symbolOop(obj)->print_symbol_on(st);
   st->print("'");
 }
 
diff --git a/hotspot/src/share/vm/oops/symbolOop.cpp b/hotspot/src/share/vm/oops/symbolOop.cpp
index 9d34325..6308735 100644
--- a/hotspot/src/share/vm/oops/symbolOop.cpp
+++ b/hotspot/src/share/vm/oops/symbolOop.cpp
@@ -68,8 +68,17 @@
 
 void symbolOopDesc::print_symbol_on(outputStream* st) {
   st = st ? st : tty;
-  for (int index = 0; index < utf8_length(); index++)
-    st->put((char)byte_at(index));
+  int length = UTF8::unicode_length((const char*)bytes(), utf8_length());
+  const char *ptr = (const char *)bytes();
+  jchar value;
+  for (int index = 0; index < length; index++) {
+    ptr = UTF8::next(ptr, &value);
+    if (value >= 32 && value < 127 || value == '\'' || value == '\\') {
+      st->put(value);
+    } else {
+      st->print("\\u%04x", value);
+    }
+  }
 }
 
 jchar* symbolOopDesc::as_unicode(int& length) const {
diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp
index 54f4793..84015b5 100644
--- a/hotspot/src/share/vm/opto/callnode.cpp
+++ b/hotspot/src/share/vm/opto/callnode.cpp
@@ -632,7 +632,7 @@
   const TypeOopPtr *adrInst_t  = addr_t->isa_oopptr();
 
   // if not an InstPtr or not an instance type, assume the worst
-  if (adrInst_t == NULL || !adrInst_t->is_instance_field()) {
+  if (adrInst_t == NULL || !adrInst_t->is_known_instance_field()) {
     return true;
   }
   Compile *C = phase->C;
diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp
index 210339a..6087c17 100644
--- a/hotspot/src/share/vm/opto/cfgnode.cpp
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp
@@ -708,12 +708,12 @@
 // Split out an instance type from a bottom phi.
 PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const {
   const TypeOopPtr *t_oop = at->isa_oopptr();
-  assert(t_oop != NULL && t_oop->is_instance(), "expecting instance oopptr");
+  assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr");
   const TypePtr *t = adr_type();
   assert(type() == Type::MEMORY &&
          (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
-          t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
-          t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop),
+          t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+          t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop),
          "bottom or raw memory required");
 
   // Check if an appropriate node already exists.
@@ -854,7 +854,8 @@
   // Until we have harmony between classes and interfaces in the type
   // lattice, we must tread carefully around phis which implicitly
   // convert the one to the other.
-  const TypeInstPtr* ttip = _type->isa_narrowoop() ? _type->isa_narrowoop()->make_oopptr()->isa_instptr() :_type->isa_instptr();
+  const TypePtr* ttp = _type->make_ptr();
+  const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL;
   bool is_intf = false;
   if (ttip != NULL) {
     ciKlass* k = ttip->klass();
@@ -873,7 +874,8 @@
       // of all the input types.  The lattice is not distributive in
       // such cases.  Ward off asserts in type.cpp by refusing to do
       // meets between interfaces and proper classes.
-      const TypeInstPtr* tiip = ti->isa_narrowoop() ? ti->is_narrowoop()->make_oopptr()->isa_instptr() : ti->isa_instptr();
+      const TypePtr* tip = ti->make_ptr();
+      const TypeInstPtr* tiip = (tip != NULL) ? tip->isa_instptr() : NULL;
       if (tiip) {
         bool ti_is_intf = false;
         ciKlass* k = tiip->klass();
@@ -930,13 +932,14 @@
     // class-typed Phi and an interface flows in, it's possible that the meet &
     // join report an interface back out.  This isn't possible but happens
     // because the type system doesn't interact well with interfaces.
-    const TypeInstPtr *jtip = jt->isa_narrowoop() ? jt->isa_narrowoop()->make_oopptr()->isa_instptr() : jt->isa_instptr();
+    const TypePtr *jtp = jt->make_ptr();
+    const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL;
     if( jtip && ttip ) {
       if( jtip->is_loaded() &&  jtip->klass()->is_interface() &&
           ttip->is_loaded() && !ttip->klass()->is_interface() ) {
         // Happens in a CTW of rt.jar, 320-341, no extra flags
         assert(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||
-               ft->isa_narrowoop() && ft->isa_narrowoop()->make_oopptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
+               ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
         jt = ft;
       }
     }
diff --git a/hotspot/src/share/vm/opto/cfgnode.hpp b/hotspot/src/share/vm/opto/cfgnode.hpp
index 689dc1f..8fd493a 100644
--- a/hotspot/src/share/vm/opto/cfgnode.hpp
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp
@@ -129,7 +129,7 @@
   };
 
   PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
-           const int iid = TypeOopPtr::UNKNOWN_INSTANCE,
+           const int iid = TypeOopPtr::InstanceTop,
            const int iidx = Compile::AliasIdxTop,
            const int ioffs = Type::OffsetTop )
     : TypeNode(t,r->req()),
diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp
index a9d3a88..3904dd5 100644
--- a/hotspot/src/share/vm/opto/compile.cpp
+++ b/hotspot/src/share/vm/opto/compile.cpp
@@ -313,9 +313,6 @@
   _compile->begin_method();
 }
 CompileWrapper::~CompileWrapper() {
-  if (_compile->failing()) {
-    _compile->print_method("Failed");
-  }
   _compile->end_method();
   if (_compile->scratch_buffer_blob() != NULL)
     BufferBlob::free(_compile->scratch_buffer_blob());
@@ -604,6 +601,8 @@
   if (failing())  return;
   NOT_PRODUCT( verify_graph_edges(); )
 
+  print_method("Before Matching");
+
 #ifndef PRODUCT
   if (PrintIdeal) {
     ttyLocker ttyl;  // keep the following output all in one block
@@ -1070,7 +1069,7 @@
       // No constant oop pointers (such as Strings); they alias with
       // unknown strings.
       tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
-    } else if( to->is_instance_field() ) {
+    } else if( to->is_known_instance_field() ) {
       tj = to; // Keep NotNull and klass_is_exact for instance type
     } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) {
       // During the 2nd round of IterGVN, NotNull castings are removed.
@@ -1191,8 +1190,8 @@
   _field = NULL;
   _is_rewritable = true; // default
   const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL;
-  if (atoop != NULL && atoop->is_instance()) {
-    const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
+  if (atoop != NULL && atoop->is_known_instance()) {
+    const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot);
     _general_index = Compile::current()->get_alias_index(gt);
   } else {
     _general_index = 0;
@@ -1481,7 +1480,7 @@
 
   NOT_PRODUCT( verify_graph_edges(); )
 
-  print_method("Start");
+  print_method("After Parsing");
 
  {
   // Iterative Global Value Numbering, including ideal transforms
@@ -1688,7 +1687,7 @@
     Output();
   }
 
-  print_method("End");
+  print_method("Final Code");
 
   // He's dead, Jim.
   _cfg     = (PhaseCFG*)0xdeadbeef;
@@ -2017,7 +2016,7 @@
         for (uint i = 0; i < cnt; i++) {
           Node* m = r->raw_out(i);
           if (m!= NULL && m->Opcode() == Op_ConN &&
-              m->bottom_type()->is_narrowoop()->make_oopptr() == t) {
+              m->bottom_type()->make_ptr() == t) {
             nn = m;
             break;
           }
@@ -2070,7 +2069,7 @@
             }
           }
         } else if (t->isa_oopptr()) {
-          in2 = ConNode::make(C, t->is_oopptr()->make_narrowoop());
+          in2 = ConNode::make(C, t->make_narrowoop());
         }
       }
       if( in2 != NULL ) {
@@ -2466,6 +2465,9 @@
     // Record the first failure reason.
     _failure_reason = reason;
   }
+  if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) {
+    C->print_method(_failure_reason);
+  }
   _root = NULL;  // flush the graph, too
 }
 
diff --git a/hotspot/src/share/vm/opto/connode.cpp b/hotspot/src/share/vm/opto/connode.cpp
index bc37ce6..8b441c9 100644
--- a/hotspot/src/share/vm/opto/connode.cpp
+++ b/hotspot/src/share/vm/opto/connode.cpp
@@ -565,26 +565,12 @@
 }
 
 const Type *DecodeNNode::Value( PhaseTransform *phase ) const {
-  if (phase->type( in(1) ) == TypeNarrowOop::NULL_PTR) {
-    return TypePtr::NULL_PTR;
-  }
-  return bottom_type();
-}
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR;
 
-Node* DecodeNNode::decode(PhaseTransform* phase, Node* value) {
-  if (value->is_EncodeP()) {
-    // (DecodeN (EncodeP p)) -> p
-    return value->in(1);
-  }
-  const Type* newtype = value->bottom_type();
-  if (newtype == TypeNarrowOop::NULL_PTR) {
-    return phase->transform(new (phase->C, 1) ConPNode(TypePtr::NULL_PTR));
-  } else if (newtype->isa_narrowoop()) {
-    return phase->transform(new (phase->C, 2) DecodeNNode(value, newtype->is_narrowoop()->make_oopptr()));
-  } else {
-    ShouldNotReachHere();
-    return NULL; // to make C++ compiler happy.
-  }
+  assert(t->isa_narrowoop(), "only  narrowoop here");
+  return t->make_ptr();
 }
 
 Node* EncodePNode::Identity(PhaseTransform* phase) {
@@ -599,27 +585,14 @@
 }
 
 const Type *EncodePNode::Value( PhaseTransform *phase ) const {
-  if (phase->type( in(1) ) == TypePtr::NULL_PTR) {
-    return TypeNarrowOop::NULL_PTR;
-  }
-  return bottom_type();
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
+
+  assert(t->isa_oopptr(), "only oopptr here");
+  return t->make_narrowoop();
 }
 
-Node* EncodePNode::encode(PhaseTransform* phase, Node* value) {
-  if (value->is_DecodeN()) {
-    // (EncodeP (DecodeN p)) -> p
-    return value->in(1);
-  }
-  const Type* newtype = value->bottom_type();
-  if (newtype == TypePtr::NULL_PTR) {
-    return phase->transform(new (phase->C, 1) ConNNode(TypeNarrowOop::NULL_PTR));
-  } else if (newtype->isa_oopptr()) {
-    return phase->transform(new (phase->C, 2) EncodePNode(value, newtype->is_oopptr()->make_narrowoop()));
-  } else {
-    ShouldNotReachHere();
-    return NULL; // to make C++ compiler happy.
-  }
-}
 
 Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
   return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
diff --git a/hotspot/src/share/vm/opto/connode.hpp b/hotspot/src/share/vm/opto/connode.hpp
index 648fb1c..a16d7f2 100644
--- a/hotspot/src/share/vm/opto/connode.hpp
+++ b/hotspot/src/share/vm/opto/connode.hpp
@@ -280,7 +280,6 @@
   virtual const Type *Value( PhaseTransform *phase ) const;
   virtual uint  ideal_reg() const { return Op_RegN; }
 
-  static Node* encode(PhaseTransform* phase, Node* value);
   virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
 };
 
@@ -300,8 +299,6 @@
   virtual Node *Identity( PhaseTransform *phase );
   virtual const Type *Value( PhaseTransform *phase ) const;
   virtual uint  ideal_reg() const { return Op_RegP; }
-
-  static Node* decode(PhaseTransform* phase, Node* value);
 };
 
 //------------------------------Conv2BNode-------------------------------------
@@ -549,10 +546,18 @@
   virtual uint hash() const ;                  // { return NO_HASH; }
   virtual uint cmp( const Node &n ) const;
 public:
-  Opaque1Node( Node *n ) : Node(0,n) {}
+  Opaque1Node( Compile* C, Node *n ) : Node(0,n) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   // Special version for the pre-loop to hold the original loop limit
   // which is consumed by range check elimination.
-  Opaque1Node( Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {}
+  Opaque1Node( Compile* C, Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   Node* original_loop_limit() { return req()==3 ? in(2) : NULL; }
   virtual int Opcode() const;
   virtual const Type *bottom_type() const { return TypeInt::INT; }
@@ -572,7 +577,11 @@
   virtual uint hash() const ;                  // { return NO_HASH; }
   virtual uint cmp( const Node &n ) const;
 public:
-  Opaque2Node( Node *n ) : Node(0,n) {}
+  Opaque2Node( Compile* C, Node *n ) : Node(0,n) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   virtual int Opcode() const;
   virtual const Type *bottom_type() const { return TypeInt::INT; }
 };
diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp
index cf4c17a..5aa90ea 100644
--- a/hotspot/src/share/vm/opto/escape.cpp
+++ b/hotspot/src/share/vm/opto/escape.cpp
@@ -483,7 +483,7 @@
 //
 void ConnectionGraph::split_AddP(Node *addp, Node *base,  PhaseGVN  *igvn) {
   const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr();
-  assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr");
+  assert(base_t != NULL && base_t->is_known_instance(), "expecting instance oopptr");
   const TypeOopPtr *t = igvn->type(addp)->isa_oopptr();
   if (t == NULL) {
     // We are computing a raw address for a store captured by an Initialize
@@ -494,8 +494,8 @@
     assert(offs != Type::OffsetBot, "offset must be a constant");
     t = base_t->add_offset(offs)->is_oopptr();
   }
-  uint inst_id =  base_t->instance_id();
-  assert(!t->is_instance() || t->instance_id() == inst_id,
+  int inst_id =  base_t->instance_id();
+  assert(!t->is_known_instance() || t->instance_id() == inst_id,
                              "old type must be non-instance or match new type");
   const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr();
   // Do NOT remove the next call: ensure an new alias index is allocated
@@ -509,7 +509,7 @@
   Node *adr = addp->in(AddPNode::Address);
   const TypeOopPtr  *atype = igvn->type(adr)->isa_oopptr();
   if (atype != NULL && atype->instance_id() != inst_id) {
-    assert(!atype->is_instance(), "no conflicting instances");
+    assert(!atype->is_known_instance(), "no conflicting instances");
     const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr();
     Node *acast = new (_compile, 2) CastPPNode(adr, new_atype);
     acast->set_req(0, adr->in(0));
@@ -663,7 +663,7 @@
     return orig_mem;
   Compile* C = phase->C;
   const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr();
-  bool is_instance = (tinst != NULL) && tinst->is_instance();
+  bool is_instance = (tinst != NULL) && tinst->is_known_instance();
   Node *prev = NULL;
   Node *result = orig_mem;
   while (prev != result) {
@@ -693,7 +693,7 @@
         AllocateNode* alloc = proj_in->as_Initialize()->allocation();
         // Stop if this is the initialization for the object instance which
         // which contains this memory slice, otherwise skip over it.
-        if (alloc == NULL || alloc->_idx != tinst->instance_id()) {
+        if (alloc == NULL || alloc->_idx != (uint)tinst->instance_id()) {
           result = proj_in->in(TypeFunc::Memory);
         }
       } else if (proj_in->is_MemBar()) {
@@ -887,7 +887,7 @@
       const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
       if (t == NULL)
         continue;  // not a TypeInstPtr
-      tinst = t->cast_to_instance(ni);
+      tinst = t->cast_to_instance_id(ni);
       igvn->hash_delete(n);
       igvn->set_type(n,  tinst);
       n->raise_bottom_type(tinst);
@@ -959,19 +959,19 @@
         Node *val = get_map(elem);   // CheckCastPP node
         TypeNode *tn = n->as_Type();
         tinst = igvn->type(val)->isa_oopptr();
-        assert(tinst != NULL && tinst->is_instance() &&
-               tinst->instance_id() == elem , "instance type expected.");
+        assert(tinst != NULL && tinst->is_known_instance() &&
+               (uint)tinst->instance_id() == elem , "instance type expected.");
 
-        const TypeOopPtr *tn_t = NULL;
         const Type *tn_type = igvn->type(tn);
+        const TypeOopPtr *tn_t;
         if (tn_type->isa_narrowoop()) {
-          tn_t = tn_type->is_narrowoop()->make_oopptr()->isa_oopptr();
+          tn_t = tn_type->make_ptr()->isa_oopptr();
         } else {
           tn_t = tn_type->isa_oopptr();
         }
 
         if (tn_t != NULL &&
- tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) {
+            tinst->cast_to_instance_id(TypeOopPtr::InstanceBot)->higher_equal(tn_t)) {
           if (tn_type->isa_narrowoop()) {
             tn_type = tinst->make_narrowoop();
           } else {
@@ -1921,9 +1921,7 @@
     case Op_StoreN:
     {
       const Type *adr_type = phase->type(n->in(MemNode::Address));
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr()) {
         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
       } else {
@@ -1948,9 +1946,7 @@
     case Op_CompareAndSwapN:
     {
       const Type *adr_type = phase->type(n->in(MemNode::Address));
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr()) {
         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
       } else {
@@ -2131,10 +2127,7 @@
     case Op_CompareAndSwapN:
     {
       Node *adr = n->in(MemNode::Address);
-      const Type *adr_type = phase->type(adr);
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      const Type *adr_type = phase->type(adr)->make_ptr();
 #ifdef ASSERT
       if (!adr_type->isa_oopptr())
         assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");
diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp
index b7d9d46..0627e50 100644
--- a/hotspot/src/share/vm/opto/gcm.cpp
+++ b/hotspot/src/share/vm/opto/gcm.cpp
@@ -307,7 +307,6 @@
 
     // Test and set the visited bit.
     if (mid->raise_LCA_visited() == mark)  continue;  // already visited
-    mid->set_raise_LCA_visited(mark);
 
     // Don't process the current LCA, otherwise the search may terminate early
     if (mid != LCA && mid->raise_LCA_mark() == mark) {
@@ -317,6 +316,8 @@
       assert(early->dominates(LCA), "early is high enough");
       // Resume searching at that point, skipping intermediate levels.
       worklist.push(LCA);
+      if (LCA == mid)
+        continue; // Don't mark as visited to avoid early termination.
     } else {
       // Keep searching through this block's predecessors.
       for (uint j = 1, jmax = mid->num_preds(); j < jmax; j++) {
@@ -324,6 +325,7 @@
         worklist.push(mid_parent);
       }
     }
+    mid->set_raise_LCA_visited(mark);
   }
   return LCA;
 }
diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp
index e65cc72..114a7ea 100644
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp
@@ -100,16 +100,18 @@
 // Constructor, either file or network output
 IdealGraphPrinter::IdealGraphPrinter() {
 
-  _traverse_outs = false;
+  // By default dump both ins and outs since dead or unreachable code
+  // needs to appear in the graph.  There are also some special cases
+  // in the mach where kill projections have no users but should
+  // appear in the dump.
+  _traverse_outs = true;
   _should_send_method = true;
   _output = NULL;
   buffer[0] = 0;
   _depth = 0;
   _current_method = NULL;
   assert(!_current_method, "current method must be initialized to NULL");
-  _arena = new Arena();
-
-  _stream = new (ResourceObj::C_HEAP) networkStream();
+  _stream = NULL;
 
   if (PrintIdealGraphFile != NULL) {
     ThreadCritical tc;
@@ -124,12 +126,16 @@
       } else {
         st.print("%s%d", PrintIdealGraphFile, _file_count);
       }
-      _output = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+      _output = stream;
     } else {
-      _output = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+      _output = stream;
     }
     _file_count++;
   } else {
+    _stream = new (ResourceObj::C_HEAP) networkStream();
+
     // Try to connect to visualizer
     if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) {
       char c = 0;
@@ -149,13 +155,24 @@
     }
   }
 
-  start_element(TOP_ELEMENT);
+  _xml = new (ResourceObj::C_HEAP) xmlStream(_output);
+
+  head(TOP_ELEMENT);
 }
 
 // Destructor, close file or network stream
 IdealGraphPrinter::~IdealGraphPrinter() {
 
-  end_element(TOP_ELEMENT);
+  tail(TOP_ELEMENT);
+
+  // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds());
+  // tty->print_cr("Output time: %d", (int)_output_time.milliseconds());
+  // tty->print_cr("Build blocks time: %d", (int)_build_blocks_time.milliseconds());
+
+  if(_xml) {
+    delete _xml;
+    _xml = NULL;
+  }
 
   if (_stream) {
     delete _stream;
@@ -171,94 +188,93 @@
   }
 }
 
-void IdealGraphPrinter::print_ifg(PhaseIFG* ifg) {
 
-  // Code to print an interference graph to tty, currently not used
+void IdealGraphPrinter::begin_elem(const char *s) {
+  _xml->begin_elem(s);
+}
 
-  /*
-  if (!_current_method) return;
-   // Remove neighbor colors
+void IdealGraphPrinter::end_elem() {
+  _xml->end_elem();
+}
 
-  for (uint i = 0; i < ifg._maxlrg; i++) {
+void IdealGraphPrinter::begin_head(const char *s) {
+  _xml->begin_head(s);
+}
 
-    IndexSet *s = ifg.neighbors(i);
-    IndexSetIterator elements(s);
-    uint neighbor;
-    while ((neighbor = elements.next()) != 0) {
-        tty->print_cr("Edge between %d and %d\n", i, neighbor);
-    }
-  }
+void IdealGraphPrinter::end_head() {
+  _xml->end_head();
+}
 
+void IdealGraphPrinter::print_attr(const char *name, intptr_t val) {
+  stringStream stream;
+  stream.print(INTX_FORMAT, val);
+  print_attr(name, stream.as_string());
+}
 
-  for (uint i = 0; i < ifg._maxlrg; i++) {
-    LRG &l = ifg.lrgs(i);
-    if (l._def) {
-      OptoReg::Name name = l.reg();
-      tty->print("OptoReg::dump: ");
-      OptoReg::dump(name);
-      tty->print_cr("");
-      tty->print_cr("name=%d\n", name);
-      if (name) {
-        if (OptoReg::is_stack(name)) {
-          tty->print_cr("Stack number %d\n", OptoReg::reg2stack(name));
+void IdealGraphPrinter::print_attr(const char *name, const char *val) {
+  _xml->print(" %s='", name);
+  text(val);
+  _xml->print("'");
+}
 
-        } else if (!OptoReg::is_valid(name)) {
-          tty->print_cr("BAD!!!");
-        } else {
+void IdealGraphPrinter::head(const char *name) {
+  _xml->head(name);
+}
 
-          if (OptoReg::is_reg(name)) {
-          tty->print_cr(OptoReg::regname(name));
-          } else {
-            int x = 0;
-          }
-        }
-        int x = 0;
-      }
+void IdealGraphPrinter::tail(const char *name) {
+  _xml->tail(name);
+}
 
-      if (l._def == NodeSentinel) {
-        tty->print("multiple mapping from %d: ", i);
-        for (int j=0; j<l._defs->length(); j++) {
-          tty->print("%d ", l._defs->at(j)->_idx);
-        }
-        tty->print_cr("");
-      } else {
-        tty->print_cr("mapping between %d and %d\n", i, l._def->_idx);
-      }
-    }
-  }*/
+void IdealGraphPrinter::text(const char *s) {
+  _xml->text(s);
+}
+
+void IdealGraphPrinter::print_prop(const char *name, int val) {
+
+  stringStream stream;
+  stream.print("%d", val);
+  print_prop(name, stream.as_string());
+}
+
+void IdealGraphPrinter::print_prop(const char *name, const char *val) {
+  begin_head(PROPERTY_ELEMENT);
+  print_attr(PROPERTY_NAME_PROPERTY, name);
+  end_head();
+  text(val);
+  tail(PROPERTY_ELEMENT);
 }
 
 void IdealGraphPrinter::print_method(ciMethod *method, int bci, InlineTree *tree) {
+  begin_head(METHOD_ELEMENT);
 
-  Properties properties;
   stringStream str;
   method->print_name(&str);
 
   stringStream shortStr;
   method->print_short_name(&shortStr);
 
+  print_attr(METHOD_NAME_PROPERTY, str.as_string());
+  print_attr(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string());
+  print_attr(METHOD_BCI_PROPERTY, bci);
 
-  properties.add(new Property(METHOD_NAME_PROPERTY, str.as_string()));
-  properties.add(new Property(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string()));
-  properties.add(new Property(METHOD_BCI_PROPERTY, bci));
-  start_element(METHOD_ELEMENT, &properties);
+  end_head();
 
-  start_element(BYTECODES_ELEMENT);
+  head(BYTECODES_ELEMENT);
   output()->print_cr("<![CDATA[");
   method->print_codes_on(output());
   output()->print_cr("]]>");
-  end_element(BYTECODES_ELEMENT);
+  tail(BYTECODES_ELEMENT);
 
-  start_element(INLINE_ELEMENT);
+  head(INLINE_ELEMENT);
   if (tree != NULL) {
     GrowableArray<InlineTree *> subtrees = tree->subtrees();
     for (int i = 0; i < subtrees.length(); i++) {
       print_inline_tree(subtrees.at(i));
     }
   }
-  end_element(INLINE_ELEMENT);
+  tail(INLINE_ELEMENT);
 
-  end_element(METHOD_ELEMENT);
+  tail(METHOD_ELEMENT);
   output()->flush();
 }
 
@@ -271,12 +287,6 @@
 
 }
 
-void IdealGraphPrinter::clear_nodes() {
- // for (int i = 0; i < _nodes.length(); i++) {
- //   _nodes.at(i)->clear_node();
- // }
-}
-
 void IdealGraphPrinter::print_inlining(Compile* compile) {
 
   // Print inline tree
@@ -298,143 +308,56 @@
   assert(method, "null methods are not allowed!");
   assert(!_current_method, "current method must be null!");
 
-  _arena->destruct_contents();
+  head(GROUP_ELEMENT);
 
-  start_element(GROUP_ELEMENT);
+  head(PROPERTIES_ELEMENT);
 
   // Print properties
-  Properties properties;
-
   // Add method name
   stringStream strStream;
   method->print_name(&strStream);
-  properties.add(new Property(METHOD_NAME_PROPERTY, strStream.as_string()));
+  print_prop(METHOD_NAME_PROPERTY, strStream.as_string());
 
   if (method->flags().is_public()) {
-    properties.add(new Property(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE));
+    print_prop(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE);
   }
 
   if (method->flags().is_static()) {
-    properties.add(new Property(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE));
+    print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE);
   }
 
-  properties.print(this);
+  tail(PROPERTIES_ELEMENT);
 
   if (_stream) {
     char answer = 0;
-    _stream->flush();
+    _xml->flush();
     int result = _stream->read(&answer, 1);
     _should_send_method = (answer == 'y');
   }
 
-  this->_nodes = GrowableArray<NodeDescription *>(_arena, 2, 0, NULL);
-  this->_edges = GrowableArray< EdgeDescription * >(_arena, 2, 0, NULL);
-
-
   this->_current_method = method;
 
-
-
-  _output->flush();
+  _xml->flush();
 }
 
 // Has to be called whenever a method has finished compilation
 void IdealGraphPrinter::end_method() {
 
-//  if (finish && !in_method) return;
-
   nmethod* method = (nmethod*)this->_current_method->code();
 
-  start_element(ASSEMBLY_ELEMENT);
- // Disassembler::decode(method, _output);
-  end_element(ASSEMBLY_ELEMENT);
-
-
-  end_element(GROUP_ELEMENT);
+  tail(GROUP_ELEMENT);
   _current_method = NULL;
-  _output->flush();
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      delete desc;
-      _nodes.at_put(i, NULL);
-    }
-  }
-  this->_nodes.clear();
-
-
-  for (int i = 0; i < _edges.length(); i++) {
-   // for (int j=0; j<_edges.at(i)->length(); j++) {
-      EdgeDescription *conn = _edges.at(i);
-      conn->print(this);
-      if (conn) {
-        delete conn;
-        _edges.at_put(i, NULL);
-      }
-    //}
-    //_edges.at(i)->clear();
-    //delete _edges.at(i);
-    //_edges.at_put(i, NULL);
-  }
-  this->_edges.clear();
-
-//  in_method = false;
-}
-
-// Outputs an XML start element
-void IdealGraphPrinter::start_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */, bool print_return /* = true */) {
-
-  start_element_helper(s, properties, false, print_indent, print_return);
-  _depth++;
-
-}
-
-// Outputs an XML start element without body
-void IdealGraphPrinter::simple_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */) {
-  start_element_helper(s, properties, true, print_indent, true);
-}
-
-// Outputs an XML start element. If outputEnd is true, the element has no body.
-void IdealGraphPrinter::start_element_helper(const char *s, Properties *properties, bool outputEnd, bool print_indent /* = false */, bool print_return /* = true */) {
-
-  assert(_output, "output stream must exist!");
-
-  if (print_indent) this->print_indent();
-  _output->print("<");
-  _output->print(s);
-  if (properties) properties->print_as_attributes(this);
-
-  if (outputEnd) {
-    _output->print("/");
-  }
-
-  _output->print(">");
-  if (print_return) _output->print_cr("");
-
+  _xml->flush();
 }
 
 // Print indent
 void IdealGraphPrinter::print_indent() {
+  tty->print_cr("printing ident %d", _depth);
   for (int i = 0; i < _depth; i++) {
-    _output->print(INDENT);
+    _xml->print(INDENT);
   }
 }
 
-// Outputs an XML end element
-void IdealGraphPrinter::end_element(const char *s, bool print_indent /* = true */, bool print_return /* = true */) {
-
-  assert(_output, "output stream must exist!");
-
-  _depth--;
-
-  if (print_indent) this->print_indent();
-  _output->print("</");
-  _output->print(s);
-  _output->print(">");
-  if (print_return) _output->print_cr("");
-
-}
-
 bool IdealGraphPrinter::traverse_outs() {
   return _traverse_outs;
 }
@@ -443,7 +366,255 @@
   _traverse_outs = b;
 }
 
-void IdealGraphPrinter::walk(Node *start) {
+intptr_t IdealGraphPrinter::get_node_id(Node *n) {
+  return (intptr_t)(n);
+}
+
+void IdealGraphPrinter::visit_node(Node *n, void *param) {
+
+  if(param) {
+
+    // Output edge
+    intptr_t dest_id = get_node_id(n);
+    for ( uint i = 0; i < n->len(); i++ ) {
+      if ( n->in(i) ) {
+        Node *source = n->in(i);
+        begin_elem(EDGE_ELEMENT);
+        intptr_t source_id = get_node_id(source);
+        print_attr(FROM_PROPERTY, source_id);
+        print_attr(TO_PROPERTY, dest_id);
+        print_attr(INDEX_PROPERTY, i);
+        end_elem();
+      }
+    }
+
+  } else {
+
+    // Output node
+    begin_head(NODE_ELEMENT);
+    print_attr(NODE_ID_PROPERTY, get_node_id(n));
+    end_head();
+
+    head(PROPERTIES_ELEMENT);
+
+    Node *node = n;
+#ifndef PRODUCT
+    node->_in_dump_cnt++;
+    print_prop(NODE_NAME_PROPERTY, (const char *)node->Name());
+    const Type *t = node->bottom_type();
+    print_prop("type", (const char *)Type::msg[t->base()]);
+    print_prop("idx", node->_idx);
+#ifdef ASSERT
+    print_prop("debug_idx", node->_debug_idx);
+#endif
+
+    if(C->cfg() != NULL) {
+      Block *block = C->cfg()->_bbs[node->_idx];
+      if(block == NULL) {
+        print_prop("block", C->cfg()->_blocks[0]->_pre_order);
+      } else {
+        print_prop("block", block->_pre_order);
+      }
+    }
+
+    const jushort flags = node->flags();
+    if (flags & Node::Flag_is_Copy) {
+      print_prop("is_copy", "true");
+    }
+    if (flags & Node::Flag_is_Call) {
+      print_prop("is_call", "true");
+    }
+    if (flags & Node::Flag_rematerialize) {
+      print_prop("rematerialize", "true");
+    }
+    if (flags & Node::Flag_needs_anti_dependence_check) {
+      print_prop("needs_anti_dependence_check", "true");
+    }
+    if (flags & Node::Flag_is_macro) {
+      print_prop("is_macro", "true");
+    }
+    if (flags & Node::Flag_is_Con) {
+      print_prop("is_con", "true");
+    }
+    if (flags & Node::Flag_is_cisc_alternate) {
+      print_prop("is_cisc_alternate", "true");
+    }
+    if (flags & Node::Flag_is_Branch) {
+      print_prop("is_branch", "true");
+    }
+    if (flags & Node::Flag_is_block_start) {
+      print_prop("is_block_start", "true");
+    }
+    if (flags & Node::Flag_is_Goto) {
+      print_prop("is_goto", "true");
+    }
+    if (flags & Node::Flag_is_dead_loop_safe) {
+      print_prop("is_dead_loop_safe", "true");
+    }
+    if (flags & Node::Flag_may_be_short_branch) {
+      print_prop("may_be_short_branch", "true");
+    }
+    if (flags & Node::Flag_is_safepoint_node) {
+      print_prop("is_safepoint_node", "true");
+    }
+    if (flags & Node::Flag_is_pc_relative) {
+      print_prop("is_pc_relative", "true");
+    }
+
+    if (C->matcher() != NULL) {
+      if (C->matcher()->is_shared(node)) {
+        print_prop("is_shared", "true");
+      } else {
+        print_prop("is_shared", "false");
+      }
+      if (C->matcher()->is_dontcare(node)) {
+        print_prop("is_dontcare", "true");
+      } else {
+        print_prop("is_dontcare", "false");
+      }
+
+      Node* old = C->matcher()->find_old_node(node);
+      if (old != NULL) {
+        print_prop("old_node_idx", old->_idx);
+      }
+    }
+
+    if (node->is_Proj()) {
+      print_prop("con", (int)node->as_Proj()->_con);
+    }
+
+    if (node->is_Mach()) {
+      print_prop("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]);
+    }
+
+    buffer[0] = 0;
+    stringStream s2(buffer, sizeof(buffer) - 1);
+
+    node->dump_spec(&s2);
+    if (t != NULL && (t->isa_instptr() || t->isa_klassptr())) {
+      const TypeInstPtr  *toop = t->isa_instptr();
+      const TypeKlassPtr *tkls = t->isa_klassptr();
+      ciKlass*           klass = toop ? toop->klass() : (tkls ? tkls->klass() : NULL );
+      if( klass && klass->is_loaded() && klass->is_interface() ) {
+        s2.print("  Interface:");
+      } else if( toop ) {
+        s2.print("  Oop:");
+      } else if( tkls ) {
+        s2.print("  Klass:");
+      }
+      t->dump_on(&s2);
+    } else if( t == Type::MEMORY ) {
+      s2.print("  Memory:");
+      MemNode::dump_adr_type(node, node->adr_type(), &s2);
+    }
+
+    assert(s2.size() < sizeof(buffer), "size in range");
+    print_prop("dump_spec", buffer);
+
+    if (node->is_block_proj()) {
+      print_prop("is_block_proj", "true");
+    }
+
+    if (node->is_block_start()) {
+      print_prop("is_block_start", "true");
+    }
+
+    const char *short_name = "short_name";
+    if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
+      int index = node->as_Proj()->_con - TypeFunc::Parms;
+      if (index >= 10) {
+        print_prop(short_name, "PA");
+      } else {
+        sprintf(buffer, "P%d", index);
+        print_prop(short_name, buffer);
+      }
+    } else if (strcmp(node->Name(), "IfTrue") == 0) {
+      print_prop(short_name, "T");
+    } else if (strcmp(node->Name(), "IfFalse") == 0) {
+      print_prop(short_name, "F");
+    } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
+
+      if (t->base() == Type::Int && t->is_int()->is_con()) {
+        const TypeInt *typeInt = t->is_int();
+        assert(typeInt->is_con(), "must be constant");
+        jint value = typeInt->get_con();
+
+        // max. 2 chars allowed
+        if (value >= -9 && value <= 99) {
+          sprintf(buffer, "%d", value);
+          print_prop(short_name, buffer);
+        } else {
+          print_prop(short_name, "I");
+        }
+      } else if (t == Type::TOP) {
+        print_prop(short_name, "^");
+      } else if (t->base() == Type::Long && t->is_long()->is_con()) {
+        const TypeLong *typeLong = t->is_long();
+        assert(typeLong->is_con(), "must be constant");
+        jlong value = typeLong->get_con();
+
+        // max. 2 chars allowed
+        if (value >= -9 && value <= 99) {
+          sprintf(buffer, "%d", value);
+          print_prop(short_name, buffer);
+        } else {
+          print_prop(short_name, "L");
+        }
+      } else if (t->base() == Type::KlassPtr) {
+        const TypeKlassPtr *typeKlass = t->is_klassptr();
+        print_prop(short_name, "CP");
+      } else if (t->base() == Type::Control) {
+        print_prop(short_name, "C");
+      } else if (t->base() == Type::Memory) {
+        print_prop(short_name, "M");
+      } else if (t->base() == Type::Abio) {
+        print_prop(short_name, "IO");
+      } else if (t->base() == Type::Return_Address) {
+        print_prop(short_name, "RA");
+      } else if (t->base() == Type::AnyPtr) {
+        print_prop(short_name, "P");
+      } else if (t->base() == Type::RawPtr) {
+        print_prop(short_name, "RP");
+      } else if (t->base() == Type::AryPtr) {
+        print_prop(short_name, "AP");
+      }
+    }
+
+    JVMState* caller = NULL;
+    if (node->is_SafePoint()) {
+      caller = node->as_SafePoint()->jvms();
+    } else {
+      Node_Notes* notes = C->node_notes_at(node->_idx);
+      if (notes != NULL) {
+        caller = notes->jvms();
+      }
+    }
+
+    if (caller != NULL) {
+      stringStream bciStream;
+      while(caller) {
+        bciStream.print("%d ", caller->bci());
+        caller = caller->caller();
+      }
+      print_prop("bci", bciStream.as_string());
+    }
+
+    if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
+      buffer[0] = 0;
+      _chaitin->dump_register(node, buffer);
+      print_prop("reg", buffer);
+      print_prop("lrg", _chaitin->n2lidx(node));
+    }
+
+    node->_in_dump_cnt--;
+#endif
+
+    tail(PROPERTIES_ELEMENT);
+    tail(NODE_ELEMENT);
+  }
+}
+
+void IdealGraphPrinter::walk_nodes(Node *start, void *param) {
 
 
   VectorSet visited(Thread::current()->resource_area());
@@ -453,7 +624,7 @@
   while(nodeStack.length() > 0) {
 
     Node *n = nodeStack.pop();
-    IdealGraphPrinter::pre_node(n, this);
+    visit_node(n, param);
 
     if (_traverse_outs) {
       for (DUIterator i = n->outs(); n->has_out(i); i++) {
@@ -474,573 +645,6 @@
   }
 }
 
-void IdealGraphPrinter::compress(int index, GrowableArray<Block>* blocks) {
-  Block *block = blocks->adr_at(index);
-
-  int ancestor = block->ancestor();
-  assert(ancestor != -1, "");
-
-  Block *ancestor_block = blocks->adr_at(ancestor);
-  if (ancestor_block->ancestor() != -1) {
-    compress(ancestor, blocks);
-
-    int label = block->label();
-    Block *label_block = blocks->adr_at(label);
-
-    int ancestor_label = ancestor_block->label();
-    Block *ancestor_label_block = blocks->adr_at(label);
-    if (ancestor_label_block->semi() < label_block->semi()) {
-      block->set_label(ancestor_label);
-    }
-
-    block->set_ancestor(ancestor_block->ancestor());
-  }
-}
-
-int IdealGraphPrinter::eval(int index, GrowableArray<Block>* blocks) {
-  Block *block = blocks->adr_at(index);
-  if (block->ancestor() == -1) {
-    return index;
-  } else {
-    compress(index, blocks);
-    return block->label();
-  }
-}
-
-void IdealGraphPrinter::link(int index1, int index2, GrowableArray<Block>* blocks) {
-  Block *block2 = blocks->adr_at(index2);
-  block2->set_ancestor(index1);
-}
-
-void IdealGraphPrinter::build_dominators(GrowableArray<Block>* blocks) {
-
-  if (blocks->length() == 0) return;
-
-  GrowableArray<int> stack;
-  stack.append(0);
-
-  GrowableArray<Block *> array;
-
-  assert(blocks->length() > 0, "");
-  blocks->adr_at(0)->set_dominator(0);
-
-  int n = 0;
-  while(!stack.is_empty()) {
-    int index = stack.pop();
-    Block *block = blocks->adr_at(index);
-    block->set_semi(n);
-    array.append(block);
-    n = n + 1;
-    for (int i = 0; i < block->succs()->length(); i++) {
-      int succ_index = block->succs()->at(i);
-      Block *succ = blocks->adr_at(succ_index);
-      if (succ->semi() == -1) {
-        succ->set_parent(index);
-        stack.push(succ_index);
-      }
-      succ->add_pred(index);
-    }
-  }
-
-  for (int i=n-1; i>0; i--) {
-    Block *block = array.at(i);
-    int block_index = block->index();
-    for (int j=0; j<block->pred()->length(); j++) {
-      int pred_index = block->pred()->at(j);
-      int cur_index = eval(pred_index, blocks);
-
-      Block *cur_block = blocks->adr_at(cur_index);
-      if (cur_block->semi() < block->semi()) {
-        block->set_semi(cur_block->semi());
-      }
-    }
-
-    int semi_index = block->semi();
-    Block *semi_block = array.at(semi_index);
-    semi_block->add_to_bucket(block_index);
-
-    link(block->parent(), block_index, blocks);
-    Block *parent_block = blocks->adr_at(block->parent());
-
-    for (int j=0; j<parent_block->bucket()->length(); j++) {
-      int cur_index = parent_block->bucket()->at(j);
-      int new_index = eval(cur_index, blocks);
-      Block *cur_block = blocks->adr_at(cur_index);
-      Block *new_block = blocks->adr_at(new_index);
-      int dom = block->parent();
-
-      if (new_block->semi() < cur_block->semi()) {
-        dom = new_index;
-      }
-
-      cur_block->set_dominator(dom);
-    }
-
-    parent_block->clear_bucket();
-  }
-
-  for (int i=1; i < n; i++) {
-
-    Block *block = array.at(i);
-    int block_index = block->index();
-
-    int semi_index = block->semi();
-    Block *semi_block = array.at(semi_index);
-
-    if (block->dominator() != semi_block->index()) {
-      int new_dom = blocks->adr_at(block->dominator())->dominator();
-      block->set_dominator(new_dom);
-    }
-  }
-
-  for (int i = 0; i < blocks->length(); i++) {
-    if (blocks->adr_at(i)->dominator() == -1) {
-      blocks->adr_at(i)->set_dominator(0);
-    }
-  }
-
-  // Build dominates array
-  for (int i=1; i < blocks->length(); i++) {
-    Block *block = blocks->adr_at(i);
-    int dominator = block->dominator();
-    Block *dom_block = blocks->adr_at(dominator);
-    dom_block->add_dominates(i);
-    dom_block->add_child(i);
-
-    while(dominator != 0) {
-      dominator = dom_block->dominator();
-      dom_block = blocks->adr_at(dominator);
-      dom_block->add_child(i);
-    }
-  }
-}
-
-void IdealGraphPrinter::build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks) {
-
-  common_dominator[index][index] = index;
-  Block *block = blocks->adr_at(index);
-  for (int i = 0; i < block->dominates()->length(); i++) {
-    Block *dominated = blocks->adr_at(block->dominates()->at(i));
-
-    for (int j=0; j<dominated->children()->length(); j++) {
-      Block *child = blocks->adr_at(dominated->children()->at(j));
-      common_dominator[index][child->index()] = common_dominator[child->index()][index] = index;
-
-      for (int k=0; k<i; k++) {
-        Block *other_dominated = blocks->adr_at(block->dominates()->at(k));
-        common_dominator[child->index()][other_dominated->index()] = common_dominator[other_dominated->index()][child->index()] = index;
-
-        for (int l=0 ; l<other_dominated->children()->length(); l++) {
-          Block *other_child = blocks->adr_at(other_dominated->children()->at(l));
-          common_dominator[child->index()][other_child->index()] = common_dominator[other_child->index()][child->index()] = index;
-        }
-      }
-    }
-
-    build_common_dominator(common_dominator, dominated->index(), blocks);
-  }
-}
-
-void IdealGraphPrinter::schedule_latest(int **common_dominator, GrowableArray<Block>* blocks) {
-
-  int queue_size = _nodes.length() + 1;
-  NodeDescription **queue = NEW_RESOURCE_ARRAY(NodeDescription *, queue_size);
-  int queue_start = 0;
-  int queue_end = 0;
-  Arena *a = new Arena();
-  VectorSet on_queue(a);
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->init_succs();
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      for (uint j=0; j<desc->node()->len(); j++) {
-        Node *n = desc->node()->in(j);
-        if (n) {
-          NodeDescription *other_desc = _nodes.at(n->_idx);
-          other_desc->add_succ(desc);
-        }
-      }
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->block_index() == -1) {
-
-      // Put Phi into same block as region
-      if (desc->node()->is_Phi() && desc->node()->in(0) && _nodes.at(desc->node()->in(0)->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->in(0)->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-
-      // Put Projections to same block as parent
-      } else if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-      } else {
-        queue[queue_end] = desc;
-        queue_end++;
-        on_queue.set(desc->node()->_idx);
-      }
-    }
-  }
-
-
-  int z = 0;
-  while(queue_start != queue_end && z < 10000) {
-
-    NodeDescription *desc = queue[queue_start];
-    queue_start = (queue_start + 1) % queue_size;
-    on_queue >>= desc->node()->_idx;
-
-    Node* node = desc->node();
-
-    if (desc->succs()->length() == 0) {
-      int x = 0;
-    }
-
-    int block_index = -1;
-    if (desc->succs()->length() != 0) {
-      for (int i = 0; i < desc->succs()->length(); i++) {
-          NodeDescription *cur_desc = desc->succs()->at(i);
-          if (cur_desc != desc) {
-            if (cur_desc->succs()->length() == 0) {
-
-              // Ignore nodes with 0 successors
-
-            } else if (cur_desc->block_index() == -1) {
-
-              // Let this node schedule first
-              block_index = -1;
-              break;
-
-            } else if (cur_desc->node()->is_Phi()){
-
-              // Special treatment for Phi functions
-              PhiNode *phi = cur_desc->node()->as_Phi();
-              assert(phi->in(0) && phi->in(0)->is_Region(), "Must have region node in first input");
-              RegionNode *region = phi->in(0)->as_Region();
-
-              for (uint j=1; j<phi->len(); j++) {
-                Node *cur_phi_input = phi->in(j);
-                if (cur_phi_input == desc->node() && region->in(j)) {
-                  NodeDescription *cur_region_input = _nodes.at(region->in(j)->_idx);
-                  if (cur_region_input->block_index() == -1) {
-
-                    // Let this node schedule first
-                    block_index = -1;
-                    break;
-                  } else {
-                    if (block_index == -1) {
-                      block_index = cur_region_input->block_index();
-                    } else {
-                      block_index = common_dominator[block_index][cur_region_input->block_index()];
-                    }
-                  }
-                }
-              }
-
-            } else {
-              if (block_index == -1) {
-                block_index = cur_desc->block_index();
-              } else {
-                block_index = common_dominator[block_index][cur_desc->block_index()];
-              }
-            }
-          }
-      }
-    }
-
-    if (block_index == -1) {
-      queue[queue_end] = desc;
-      queue_end = (queue_end + 1) % queue_size;
-      on_queue.set(desc->node()->_idx);
-      z++;
-    } else {
-      assert(desc->block_index() == -1, "");
-      desc->set_block_index(block_index);
-      blocks->adr_at(block_index)->add_node(desc);
-      z = 0;
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->block_index() == -1) {
-
-      //if (desc->node()->is_Proj() || desc->node()->is_Con()) {
-        Node *parent = desc->node()->in(0);
-        uint cur = 1;
-        while(!parent && cur < desc->node()->len()) {
-          parent = desc->node()->in(cur);
-          cur++;
-        }
-
-        if (parent && _nodes.at(parent->_idx)->block_index() != -1) {
-          int index = _nodes.at(parent->_idx)->block_index();
-          desc->set_block_index(index);
-          blocks->adr_at(index)->add_node(desc);
-        } else {
-          desc->set_block_index(0);
-          blocks->adr_at(0)->add_node(desc);
-          //ShouldNotReachHere();
-        }
-      //}
-      /*
-      if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-      } */
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->clear_succs();
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      int block_index = desc->block_index();
-
-      assert(block_index >= 0 && block_index < blocks->length(), "Block index must be in range");
-      assert(blocks->adr_at(block_index)->nodes()->contains(desc), "Node must be child of block");
-    }
-  }
-  a->destruct_contents();
-}
-
-void IdealGraphPrinter::build_blocks(Node *root) {
-
-  Arena *a = new Arena();
-  Node_Stack stack(a, 100);
-
-  VectorSet visited(a);
-  stack.push(root, 0);
-  GrowableArray<Block> blocks(a, 2, 0, Block(0));
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    if (_nodes.at(i)) _nodes.at(i)->set_block_index(-1);
-  }
-
-
-  // Order nodes such that node index is equal to idx
-  for (int i = 0; i < _nodes.length(); i++) {
-
-    if (_nodes.at(i)) {
-      NodeDescription *node = _nodes.at(i);
-      int index = node->node()->_idx;
-      if (index != i) {
-        _nodes.at_grow(index);
-        NodeDescription *tmp = _nodes.at(index);
-        *(_nodes.adr_at(index)) = node;
-        *(_nodes.adr_at(i)) = tmp;
-        i--;
-      }
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *node = _nodes.at(i);
-    if (node) {
-      assert(node->node()->_idx == (uint)i, "");
-    }
-  }
-
-  while(stack.is_nonempty()) {
-
-    //Node *n = stack.node();
-    //int index = stack.index();
-    Node *proj = stack.node();//n->in(index);
-    const Node *parent = proj->is_block_proj();
-    if (parent == NULL) {
-      parent = proj;
-    }
-
-    if (!visited.test_set(parent->_idx)) {
-
-      NodeDescription *end_desc = _nodes.at(parent->_idx);
-      int block_index = blocks.length();
-      Block block(block_index);
-      blocks.append(block);
-      Block *b = blocks.adr_at(block_index);
-      b->set_start(end_desc);
-     // assert(end_desc->block_index() == -1, "");
-      end_desc->set_block_index(block_index);
-      b->add_node(end_desc);
-
-      // Skip any control-pinned middle'in stuff
-      Node *p = proj;
-      NodeDescription *start_desc = NULL;
-      do {
-        proj = p;                   // Update pointer to last Control
-        if (p->in(0) == NULL) {
-          start_desc = end_desc;
-          break;
-        }
-        p = p->in(0);               // Move control forward
-        start_desc = _nodes.at(p->_idx);
-        assert(start_desc, "");
-
-        if (start_desc != end_desc && start_desc->block_index() == -1) {
-          assert(start_desc->block_index() == -1, "");
-          assert(block_index < blocks.length(), "");
-          start_desc->set_block_index(block_index);
-          b->add_node(start_desc);
-        }
-     } while( !p->is_block_proj() &&
-               !p->is_block_start() );
-
-      for (uint i = 0; i < start_desc->node()->len(); i++) {
-
-          Node *pred_node = start_desc->node()->in(i);
-
-
-          if (pred_node && pred_node != start_desc->node()) {
-            const Node *cur_parent = pred_node->is_block_proj();
-            if (cur_parent != NULL) {
-              pred_node = (Node *)cur_parent;
-            }
-
-            NodeDescription *pred_node_desc = _nodes.at(pred_node->_idx);
-            if (pred_node_desc->block_index() != -1) {
-              blocks.adr_at(pred_node_desc->block_index())->add_succ(block_index);
-            }
-          }
-      }
-
-      for (DUIterator_Fast dmax, i = end_desc->node()->fast_outs(dmax); i < dmax; i++) {
-        Node* cur_succ = end_desc->node()->fast_out(i);
-        NodeDescription *cur_succ_desc = _nodes.at(cur_succ->_idx);
-
-        DUIterator_Fast dmax2, i2 = cur_succ->fast_outs(dmax2);
-        if (cur_succ->is_block_proj() && i2 < dmax2 && !cur_succ->is_Root()) {
-
-          for (; i2<dmax2; i2++) {
-            Node *cur_succ2 = cur_succ->fast_out(i2);
-            if (cur_succ2) {
-              cur_succ_desc = _nodes.at(cur_succ2->_idx);
-              if (cur_succ_desc == NULL) {
-                // dead node so skip it
-                continue;
-              }
-              if (cur_succ2 != end_desc->node() && cur_succ_desc->block_index() != -1) {
-                b->add_succ(cur_succ_desc->block_index());
-              }
-            }
-          }
-
-        } else {
-
-          if (cur_succ != end_desc->node() && cur_succ_desc && cur_succ_desc->block_index() != -1) {
-            b->add_succ(cur_succ_desc->block_index());
-          }
-        }
-      }
-
-
-      int num_preds = p->len();
-      int bottom = -1;
-      if (p->is_Region() || p->is_Phi()) {
-        bottom = 0;
-      }
-
-      int pushed = 0;
-      for (int i=num_preds - 1; i > bottom; i--) {
-        if (p->in(i) != NULL && p->in(i) != p) {
-          stack.push(p->in(i), 0);
-          pushed++;
-        }
-      }
-
-      if (pushed == 0 && p->is_Root() && !_matcher) {
-        // Special case when backedges to root are not yet built
-        for (int i = 0; i < _nodes.length(); i++) {
-          if (_nodes.at(i) && _nodes.at(i)->node()->is_SafePoint() && _nodes.at(i)->node()->outcnt() == 0) {
-            stack.push(_nodes.at(i)->node(), 0);
-          }
-        }
-      }
-
-    } else {
-      stack.pop();
-    }
-  }
-
-  build_dominators(&blocks);
-
-  int **common_dominator = NEW_RESOURCE_ARRAY(int *, blocks.length());
-  for (int i = 0; i < blocks.length(); i++) {
-    int *cur = NEW_RESOURCE_ARRAY(int, blocks.length());
-    common_dominator[i] = cur;
-
-    for (int j=0; j<blocks.length(); j++) {
-      cur[j] = 0;
-    }
-  }
-
-  for (int i = 0; i < blocks.length(); i++) {
-    blocks.adr_at(i)->add_child(blocks.adr_at(i)->index());
-  }
-  build_common_dominator(common_dominator, 0, &blocks);
-
-  schedule_latest(common_dominator, &blocks);
-
-  start_element(CONTROL_FLOW_ELEMENT);
-
-  for (int i = 0; i < blocks.length(); i++) {
-    Block *block = blocks.adr_at(i);
-
-    Properties props;
-    props.add(new Property(BLOCK_NAME_PROPERTY, i));
-    props.add(new Property(BLOCK_DOMINATOR_PROPERTY, block->dominator()));
-    start_element(BLOCK_ELEMENT, &props);
-
-    if (block->succs()->length() > 0) {
-      start_element(SUCCESSORS_ELEMENT);
-      for (int j=0; j<block->succs()->length(); j++) {
-        int cur_index = block->succs()->at(j);
-        if (cur_index != 0 /* start_block has must not have inputs */) {
-          Properties properties;
-          properties.add(new Property(BLOCK_NAME_PROPERTY, cur_index));
-          simple_element(SUCCESSOR_ELEMENT, &properties);
-        }
-      }
-      end_element(SUCCESSORS_ELEMENT);
-    }
-
-    start_element(NODES_ELEMENT);
-
-    for (int j=0; j<block->nodes()->length(); j++) {
-      NodeDescription *n = block->nodes()->at(j);
-      Properties properties;
-      properties.add(new Property(NODE_ID_PROPERTY, n->id()));
-      simple_element(NODE_ELEMENT, &properties);
-    }
-
-    end_element(NODES_ELEMENT);
-
-    end_element(BLOCK_ELEMENT);
-  }
-
-
-  end_element(CONTROL_FLOW_ELEMENT);
-
-  a->destruct_contents();
-}
-
 void IdealGraphPrinter::print_method(Compile* compile, const char *name, int level, bool clear_nodes) {
   print(compile, name, (Node *)compile->root(), level, clear_nodes);
 }
@@ -1048,872 +652,53 @@
 // Print current ideal graph
 void IdealGraphPrinter::print(Compile* compile, const char *name, Node *node, int level, bool clear_nodes) {
 
-//  if (finish && !in_method) return;
   if (!_current_method || !_should_send_method || level > PrintIdealGraphLevel) return;
 
-  assert(_current_method, "newMethod has to be called first!");
-
-  if (clear_nodes) {
-    int x = 0;
-  }
-
-  _clear_nodes = clear_nodes;
+  this->C = compile;
 
   // Warning, unsafe cast?
-  _chaitin = (PhaseChaitin *)compile->regalloc();
-  _matcher = compile->matcher();
+  _chaitin = (PhaseChaitin *)C->regalloc();
 
+  begin_head(GRAPH_ELEMENT);
+  print_attr(GRAPH_NAME_PROPERTY, (const char *)name);
+  end_head();
 
-  // Update nodes
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->set_state(Invalid);
-    }
-  }
-  Node *n = node;
-  walk(n);
+  head(NODES_ELEMENT);
+  walk_nodes(node, NULL);
+  tail(NODES_ELEMENT);
 
-  // Update edges
-  for (int i = 0; i < _edges.length(); i++) {
-      _edges.at(i)->set_state(Invalid);
-  }
+  head(EDGES_ELEMENT);
+  walk_nodes(node, (void *)1);
+  tail(EDGES_ELEMENT);
+  if (C->cfg() != NULL) {
+    head(CONTROL_FLOW_ELEMENT);
+    for (uint i = 0; i < C->cfg()->_blocks.size(); i++) {
+      Block *b = C->cfg()->_blocks[i];
+      begin_head(BLOCK_ELEMENT);
+      print_attr(BLOCK_NAME_PROPERTY, b->_pre_order);
+      end_head();
 
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->state() != Invalid) {
-
-      int to = desc->id();
-      uint len = desc->node()->len();
-      for (uint j=0; j<len; j++) {
-        Node *n = desc->node()->in(j);
-
-        if (n) {
-
-
-          intptr_t from = (intptr_t)n;
-
-          // Assert from node is valid
-          /*
-          bool ok = false;
-          for (int k=0; k<_nodes.length(); k++) {
-            NodeDescription *desc = _nodes.at(k);
-            if (desc && desc->id() == from) {
-              assert(desc->state() != Invalid, "");
-              ok = true;
-            }
-          }
-          assert(ok, "");*/
-
-          uint index = j;
-          if (index >= desc->node()->req()) {
-            index = desc->node()->req();
-          }
-
-          print_edge(from, to, index);
-        }
+      head(SUCCESSORS_ELEMENT);
+      for (uint s = 0; s < C->cfg()->_blocks[i]->_num_succs; s++) {
+        begin_elem(SUCCESSOR_ELEMENT);
+        print_attr(BLOCK_NAME_PROPERTY, b->_succs[s]->_pre_order);
+        end_elem();
       }
+      tail(SUCCESSORS_ELEMENT);
+
+      tail(BLOCK_ELEMENT);
     }
+
+    tail(CONTROL_FLOW_ELEMENT);
   }
-
-  bool is_different = false;
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->state() != Valid) {
-      is_different = true;
-      break;
-    }
-  }
-
-  if (!is_different) {
-    for (int i = 0; i < _edges.length(); i++) {
-      EdgeDescription *conn = _edges.at(i);
-      if (conn && conn->state() != Valid) {
-        is_different = true;
-        break;
-      }
-    }
-  }
-
-  // No changes -> do not print graph
-  if (!is_different) return;
-
-  Properties properties;
-  properties.add(new Property(GRAPH_NAME_PROPERTY, (const char *)name));
-  start_element(GRAPH_ELEMENT, &properties);
-
-  start_element(NODES_ELEMENT);
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->print(this);
-      if (desc->state() == Invalid) {
-        delete desc;
-        _nodes.at_put(i, NULL);
-      } else {
-        desc->set_state(Valid);
-      }
-    }
-  }
-  end_element(NODES_ELEMENT);
-
-  build_blocks(node);
-
-  start_element(EDGES_ELEMENT);
-  for (int i = 0; i < _edges.length(); i++) {
-    EdgeDescription *conn = _edges.at(i);
-
-    // Assert from and to nodes are valid
-    /*
-    if (!conn->state() == Invalid) {
-      bool ok1 = false;
-      bool ok2 = false;
-      for (int j=0; j<_nodes.length(); j++) {
-        NodeDescription *desc = _nodes.at(j);
-        if (desc && desc->id() == conn->from()) {
-          ok1 = true;
-        }
-
-        if (desc && desc->id() == conn->to()) {
-          ok2 = true;
-        }
-      }
-
-      assert(ok1, "from node not found!");
-      assert(ok2, "to node not found!");
-    }*/
-
-    conn->print(this);
-    if (conn->state() == Invalid) {
-      _edges.remove_at(i);
-      delete conn;
-      i--;
-    }
-  }
-
-  end_element(EDGES_ELEMENT);
-
-  end_element(GRAPH_ELEMENT);
-
-  _output->flush();
-}
-
-// Print edge
-void IdealGraphPrinter::print_edge(int from, int to, int index) {
-
-  EdgeDescription *conn = new EdgeDescription(from, to, index);
-  for (int i = 0; i < _edges.length(); i++) {
-    if (_edges.at(i)->equals(conn)) {
-      conn->set_state(Valid);
-      delete _edges.at(i);
-      _edges.at_put(i, conn);
-      return;
-    }
-  }
-
-  _edges.append(conn);
+  tail(GRAPH_ELEMENT);
+  output()->flush();
 }
 
 extern const char *NodeClassNames[];
 
-// Create node description
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::create_node_description(Node* node) {
-
-#ifndef PRODUCT
-  node->_in_dump_cnt++;
-  NodeDescription *desc = new NodeDescription(node);
-  desc->properties()->add(new Property(NODE_NAME_PROPERTY, (const char *)node->Name()));
-
-  const Type *t = node->bottom_type();
-  desc->properties()->add(new Property("type", (const char *)Type::msg[t->base()]));
-
-  desc->properties()->add(new Property("idx", node->_idx));
-#ifdef ASSERT
-  desc->properties()->add(new Property("debug_idx", node->_debug_idx));
-#endif
-
-
-  const jushort flags = node->flags();
-  if (flags & Node::Flag_is_Copy) {
-    desc->properties()->add(new Property("is_copy", "true"));
-  }
-  if (flags & Node::Flag_is_Call) {
-    desc->properties()->add(new Property("is_call", "true"));
-  }
-  if (flags & Node::Flag_rematerialize) {
-    desc->properties()->add(new Property("rematerialize", "true"));
-  }
-  if (flags & Node::Flag_needs_anti_dependence_check) {
-    desc->properties()->add(new Property("needs_anti_dependence_check", "true"));
-  }
-  if (flags & Node::Flag_is_macro) {
-    desc->properties()->add(new Property("is_macro", "true"));
-  }
-  if (flags & Node::Flag_is_Con) {
-    desc->properties()->add(new Property("is_con", "true"));
-  }
-  if (flags & Node::Flag_is_cisc_alternate) {
-    desc->properties()->add(new Property("is_cisc_alternate", "true"));
-  }
-  if (flags & Node::Flag_is_Branch) {
-    desc->properties()->add(new Property("is_branch", "true"));
-  }
-  if (flags & Node::Flag_is_block_start) {
-    desc->properties()->add(new Property("is_block_start", "true"));
-  }
-  if (flags & Node::Flag_is_Goto) {
-    desc->properties()->add(new Property("is_goto", "true"));
-  }
-  if (flags & Node::Flag_is_dead_loop_safe) {
-    desc->properties()->add(new Property("is_dead_loop_safe", "true"));
-  }
-  if (flags & Node::Flag_may_be_short_branch) {
-    desc->properties()->add(new Property("may_be_short_branch", "true"));
-  }
-  if (flags & Node::Flag_is_safepoint_node) {
-    desc->properties()->add(new Property("is_safepoint_node", "true"));
-  }
-  if (flags & Node::Flag_is_pc_relative) {
-    desc->properties()->add(new Property("is_pc_relative", "true"));
-  }
-
-  if (_matcher) {
-    if (_matcher->is_shared(desc->node())) {
-      desc->properties()->add(new Property("is_shared", "true"));
-    } else {
-      desc->properties()->add(new Property("is_shared", "false"));
-    }
-
-    if (_matcher->is_dontcare(desc->node())) {
-      desc->properties()->add(new Property("is_dontcare", "true"));
-    } else {
-      desc->properties()->add(new Property("is_dontcare", "false"));
-    }
-  }
-
-  if (node->is_Proj()) {
-    desc->properties()->add(new Property("con", (int)node->as_Proj()->_con));
-  }
-
-  if (node->is_Mach()) {
-    desc->properties()->add(new Property("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]));
-  }
-
-
-
-
-
-  outputStream *oldTty = tty;
-  buffer[0] = 0;
-  stringStream s2(buffer, sizeof(buffer) - 1);
-
-  node->dump_spec(&s2);
-  assert(s2.size() < sizeof(buffer), "size in range");
-  desc->properties()->add(new Property("dump_spec", buffer));
-
-  if (node->is_block_proj()) {
-    desc->properties()->add(new Property("is_block_proj", "true"));
-  }
-
-  if (node->is_block_start()) {
-    desc->properties()->add(new Property("is_block_start", "true"));
-  }
-
-  const char *short_name = "short_name";
-  if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
-      int index = node->as_Proj()->_con - TypeFunc::Parms;
-      if (index >= 10) {
-        desc->properties()->add(new Property(short_name, "PA"));
-      } else {
-        sprintf(buffer, "P%d", index);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-  } else if (strcmp(node->Name(), "IfTrue") == 0) {
-     desc->properties()->add(new Property(short_name, "T"));
-  } else if (strcmp(node->Name(), "IfFalse") == 0) {
-     desc->properties()->add(new Property(short_name, "F"));
-  } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
-
-    if (t->base() == Type::Int && t->is_int()->is_con()) {
-      const TypeInt *typeInt = t->is_int();
-      assert(typeInt->is_con(), "must be constant");
-      jint value = typeInt->get_con();
-
-      // max. 2 chars allowed
-      if (value >= -9 && value <= 99) {
-        sprintf(buffer, "%d", value);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-      else
-      {
-        desc->properties()->add(new Property(short_name, "I"));
-      }
-    } else if (t == Type::TOP) {
-      desc->properties()->add(new Property(short_name, "^"));
-    } else if (t->base() == Type::Long && t->is_long()->is_con()) {
-      const TypeLong *typeLong = t->is_long();
-      assert(typeLong->is_con(), "must be constant");
-      jlong value = typeLong->get_con();
-
-      // max. 2 chars allowed
-      if (value >= -9 && value <= 99) {
-        sprintf(buffer, "%d", value);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-      else
-      {
-        desc->properties()->add(new Property(short_name, "L"));
-      }
-    } else if (t->base() == Type::KlassPtr) {
-      const TypeKlassPtr *typeKlass = t->is_klassptr();
-      desc->properties()->add(new Property(short_name, "CP"));
-    } else if (t->base() == Type::Control) {
-      desc->properties()->add(new Property(short_name, "C"));
-    } else if (t->base() == Type::Memory) {
-      desc->properties()->add(new Property(short_name, "M"));
-    } else if (t->base() == Type::Abio) {
-      desc->properties()->add(new Property(short_name, "IO"));
-    } else if (t->base() == Type::Return_Address) {
-      desc->properties()->add(new Property(short_name, "RA"));
-    } else if (t->base() == Type::AnyPtr) {
-      desc->properties()->add(new Property(short_name, "P"));
-    } else if (t->base() == Type::RawPtr) {
-      desc->properties()->add(new Property(short_name, "RP"));
-    } else if (t->base() == Type::AryPtr) {
-      desc->properties()->add(new Property(short_name, "AP"));
-    }
-  }
-
-  if (node->is_SafePoint()) {
-    SafePointNode *safePointNode = node->as_SafePoint();
-    if (safePointNode->jvms()) {
-      stringStream bciStream;
-      bciStream.print("%d ", safePointNode->jvms()->bci());
-      JVMState *caller = safePointNode->jvms()->caller();
-      while(caller) {
-        bciStream.print("%d ", caller->bci());
-
-        caller = caller->caller();
-      }
-      desc->properties()->add(new Property("bci", bciStream.as_string()));
-    }
-  }
-
-  if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
-    buffer[0] = 0;
-    _chaitin->dump_register(node, buffer);
-    desc->properties()->add(new Property("reg", buffer));
-    desc->properties()->add(new Property("lrg", _chaitin->n2lidx(node)));
-  }
-
-
-  node->_in_dump_cnt--;
-  return desc;
-#else
-  return NULL;
-#endif
-}
-
-void IdealGraphPrinter::pre_node(Node* node, void *env) {
-
-  IdealGraphPrinter *printer = (IdealGraphPrinter *)env;
-
-  NodeDescription *newDesc = printer->create_node_description(node);
-
-  if (printer->_clear_nodes) {
-
-    printer->_nodes.append(newDesc);
-  } else {
-
-    NodeDescription *desc = printer->_nodes.at_grow(node->_idx, NULL);
-
-    if (desc && desc->equals(newDesc)) {
-      //desc->set_state(Valid);
-      //desc->set_node(node);
-      delete desc;
-      printer->_nodes.at_put(node->_idx, NULL);
-      newDesc->set_state(Valid);
-      //printer->_nodes.at_put(node->_idx, newDesc);
-    } else {
-
-      if (desc && desc->id() == newDesc->id()) {
-        delete desc;
-        printer->_nodes.at_put(node->_idx, NULL);
-        newDesc->set_state(New);
-
-      }
-
-      //if (desc) {
-      //  delete desc;
-      //}
-
-      //printer->_nodes.at_put(node->_idx, newDesc);
-    }
-
-    printer->_nodes.append(newDesc);
-  }
-}
-
-void IdealGraphPrinter::post_node(Node* node, void *env) {
-}
-
 outputStream *IdealGraphPrinter::output() {
-  return _output;
-}
-
-IdealGraphPrinter::Description::Description() {
-  _state = New;
-}
-
-void IdealGraphPrinter::Description::print(IdealGraphPrinter *printer) {
-  if (_state == Invalid) {
-    print_removed(printer);
-  } else if (_state == New) {
-    print_changed(printer);
-  }
-}
-
-void IdealGraphPrinter::Description::set_state(State s) {
-  _state = s;
-}
-
-IdealGraphPrinter::State IdealGraphPrinter::Description::state() {
-  return _state;
-}
-
-void IdealGraphPrinter::Block::set_proj(NodeDescription *n) {
-  _proj = n;
-}
-
-void IdealGraphPrinter::Block::set_start(NodeDescription *n) {
-  _start = n;
-}
-
-int IdealGraphPrinter::Block::semi() {
-  return _semi;
-}
-
-int IdealGraphPrinter::Block::parent() {
-  return _parent;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::bucket() {
-  return &_bucket;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::children() {
-  return &_children;
-}
-
-void IdealGraphPrinter::Block::add_child(int i) {
-  _children.append(i);
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::dominates() {
-  return &_dominates;
-}
-
-void IdealGraphPrinter::Block::add_dominates(int i) {
-  _dominates.append(i);
-}
-
-void IdealGraphPrinter::Block::add_to_bucket(int i) {
-  _bucket.append(i);
-}
-
-void IdealGraphPrinter::Block::clear_bucket() {
-  _bucket.clear();
-}
-
-void IdealGraphPrinter::Block::set_dominator(int i) {
-  _dominator = i;
-}
-
-void IdealGraphPrinter::Block::set_label(int i) {
-  _label = i;
-}
-
-int IdealGraphPrinter::Block::label() {
-  return _label;
-}
-
-int IdealGraphPrinter::Block::ancestor() {
-  return _ancestor;
-}
-
-void IdealGraphPrinter::Block::set_ancestor(int i) {
-  _ancestor = i;
-}
-
-int IdealGraphPrinter::Block::dominator() {
-  return _dominator;
-}
-
-int IdealGraphPrinter::Block::index() {
-  return _index;
-}
-
-void IdealGraphPrinter::Block::set_parent(int i) {
-  _parent = i;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::pred() {
-  return &_pred;
-}
-
-void IdealGraphPrinter::Block::set_semi(int i) {
-  _semi = i;
-}
-
-IdealGraphPrinter::Block::Block() {
-}
-
-IdealGraphPrinter::Block::Block(int index) {
-  _index = index;
-  _label = index;
-  _semi = -1;
-  _ancestor = -1;
-  _dominator = -1;
-}
-
-void IdealGraphPrinter::Block::add_pred(int i) {
-  _pred.append(i);
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::proj() {
-  return _proj;
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::start() {
-  return _start;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::succs() {
-  return &_succs;
-}
-
-void IdealGraphPrinter::Block::add_succ(int index) {
-
-  if (this->_index == 16 && index == 15) {
-    int x = 0;
-  }
-
-  if (!_succs.contains(index)) {
-    _succs.append(index);
-  }
-}
-
-
-void IdealGraphPrinter::Block::add_node(NodeDescription *n) {
-  if (!_nodes.contains(n)) {
-    _nodes.append(n);
-  }
-}
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::Block::nodes() {
-  return &_nodes;
-}
-
-int IdealGraphPrinter::NodeDescription::count = 0;
-
-IdealGraphPrinter::NodeDescription::NodeDescription(Node* node) : _node(node) {
-  _id = (intptr_t)(node);
-  _block_index = -1;
-}
-
-IdealGraphPrinter::NodeDescription::~NodeDescription() {
-  _properties.clean();
-}
-
-// void IdealGraphPrinter::NodeDescription::set_node(Node* node) {
-//   //this->_node = node;
-// }
-
-int IdealGraphPrinter::NodeDescription::block_index() {
-  return _block_index;
-}
-
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::NodeDescription::succs() {
-  return &_succs;
-}
-
-void IdealGraphPrinter::NodeDescription::clear_succs() {
-  _succs.clear();
-}
-
-void IdealGraphPrinter::NodeDescription::init_succs() {
-  _succs = GrowableArray<NodeDescription *>();
-}
-
-void IdealGraphPrinter::NodeDescription::add_succ(NodeDescription *desc) {
-  _succs.append(desc);
-}
-
-void IdealGraphPrinter::NodeDescription::set_block_index(int i) {
-  _block_index = i;
-}
-
-bool IdealGraphPrinter::NodeDescription::equals(NodeDescription *desc) {
-  if (desc == NULL) return false;
-  if (desc->id() != id()) return false;
-  return properties()->equals(desc->properties());
-}
-
-Node* IdealGraphPrinter::NodeDescription::node() {
-  return _node;
-}
-
-IdealGraphPrinter::Properties* IdealGraphPrinter::NodeDescription::properties() {
-  return &_properties;
-}
-
-uint IdealGraphPrinter::NodeDescription::id() {
-  return _id;
-}
-
-void IdealGraphPrinter::NodeDescription::print_changed(IdealGraphPrinter *printer) {
-
-
-  Properties properties;
-  properties.add(new Property(NODE_ID_PROPERTY, id()));
-  printer->start_element(NODE_ELEMENT, &properties);
-
-  this->properties()->print(printer);
-
-
-  printer->end_element(NODE_ELEMENT);
-}
-
-void IdealGraphPrinter::NodeDescription::print_removed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(NODE_ID_PROPERTY, id()));
-  printer->simple_element(REMOVE_NODE_ELEMENT, &properties);
-}
-
-IdealGraphPrinter::EdgeDescription::EdgeDescription(int from, int to, int index) {
-  this->_from = from;
-  this->_to = to;
-  this->_index = index;
-}
-
-IdealGraphPrinter::EdgeDescription::~EdgeDescription() {
-}
-
-int IdealGraphPrinter::EdgeDescription::from() {
-  return _from;
-}
-
-int IdealGraphPrinter::EdgeDescription::to() {
-  return _to;
-}
-
-void IdealGraphPrinter::EdgeDescription::print_changed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(INDEX_PROPERTY, _index));
-  properties.add(new Property(FROM_PROPERTY, _from));
-  properties.add(new Property(TO_PROPERTY, _to));
-  printer->simple_element(EDGE_ELEMENT, &properties);
-}
-
-void IdealGraphPrinter::EdgeDescription::print_removed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(INDEX_PROPERTY, _index));
-  properties.add(new Property(FROM_PROPERTY, _from));
-  properties.add(new Property(TO_PROPERTY, _to));
-  printer->simple_element(REMOVE_EDGE_ELEMENT, &properties);
-}
-
-bool IdealGraphPrinter::EdgeDescription::equals(IdealGraphPrinter::EdgeDescription *desc) {
-  if (desc == NULL) return false;
-  return (_from == desc->_from && _to == desc->_to && _index == desc->_index);
-}
-
-IdealGraphPrinter::Properties::Properties() : list(new (ResourceObj::C_HEAP) GrowableArray<Property *>(2, 0, NULL, true)) {
-}
-
-IdealGraphPrinter::Properties::~Properties() {
-  clean();
-  delete list;
-}
-
-void IdealGraphPrinter::Properties::add(Property *p) {
-  assert(p != NULL, "Property not NULL");
-  list->append(p);
-}
-
-void IdealGraphPrinter::Properties::print(IdealGraphPrinter *printer) {
-  printer->start_element(PROPERTIES_ELEMENT);
-
-  for (int i = 0; i < list->length(); i++) {
-    list->at(i)->print(printer);
-  }
-
-  printer->end_element(PROPERTIES_ELEMENT);
-}
-
-void IdealGraphPrinter::Properties::clean() {
-  for (int i = 0; i < list->length(); i++) {
-    delete list->at(i);
-    list->at_put(i, NULL);
-  }
-  list->clear();
-  assert(list->length() == 0, "List cleared");
-}
-
-void IdealGraphPrinter::Properties::remove(const char *name) {
-  for (int i = 0; i < list->length(); i++) {
-    if (strcmp(list->at(i)->name(), name) == 0) {
-      delete list->at(i);
-      list->remove_at(i);
-      i--;
-    }
-  }
-}
-
-void IdealGraphPrinter::Properties::print_as_attributes(IdealGraphPrinter *printer) {
-
-  for (int i = 0; i < list->length(); i++) {
-    assert(list->at(i) != NULL, "Property not null!");
-    printer->output()->print(" ");
-    list->at(i)->print_as_attribute(printer);
-  }
-}
-
-bool IdealGraphPrinter::Properties::equals(Properties* p) {
-  if (p->list->length() != this->list->length()) return false;
-
-  for (int i = 0; i < list->length(); i++) {
-    assert(list->at(i) != NULL, "Property not null!");
-    if (!list->at(i)->equals(p->list->at(i))) return false;
-  }
-
-  return true;
-}
-
-IdealGraphPrinter::Property::Property() {
-  _name = NULL;
-  _value = NULL;
-}
-
-const char *IdealGraphPrinter::Property::name() {
-  return _name;
-}
-
-IdealGraphPrinter::Property::Property(const Property* p) {
-
-  this->_name = NULL;
-  this->_value = NULL;
-
-  if (p->_name != NULL) {
-    _name = dup(p->_name);
-  }
-
-  if (p->_value) {
-    _value = dup(p->_value);
-  }
-}
-
-IdealGraphPrinter::Property::~Property() {
-
-  clean();
-}
-
-IdealGraphPrinter::Property::Property(const char *name, const char *value) {
-
-  assert(name, "Name must not be null!");
-  assert(value, "Value must not be null!");
-
-  _name = dup(name);
-  _value = dup(value);
-}
-
-IdealGraphPrinter::Property::Property(const char *name, int intValue) {
-  _name = dup(name);
-
-  stringStream stream;
-  stream.print("%d", intValue);
-  _value = dup(stream.as_string());
-}
-
-void IdealGraphPrinter::Property::clean() {
-  if (_name) {
-    delete _name;
-    _name = NULL;
-  }
-
-  if (_value) {
-    delete _value;
-    _value = NULL;
-  }
-}
-
-
-bool IdealGraphPrinter::Property::is_null() {
-  return _name == NULL;
-}
-
-void IdealGraphPrinter::Property::print(IdealGraphPrinter *printer) {
-
-  assert(!is_null(), "null properties cannot be printed!");
-  Properties properties;
-  properties.add(new Property(PROPERTY_NAME_PROPERTY, _name));
-  printer->start_element(PROPERTY_ELEMENT, &properties, false, false);
-  printer->print_xml(_value);
-  printer->end_element(PROPERTY_ELEMENT, false, true);
-}
-
-void IdealGraphPrinter::Property::print_as_attribute(IdealGraphPrinter *printer) {
-
-  printer->output()->print(_name);
-  printer->output()->print("=\"");
-  printer->print_xml(_value);
-  printer->output()->print("\"");
-}
-
-
-bool IdealGraphPrinter::Property::equals(Property* p) {
-
-  if (is_null() && p->is_null()) return true;
-  if (is_null()) return false;
-  if (p->is_null()) return false;
-
-  int cmp1 = strcmp(p->_name, _name);
-  if (cmp1 != 0) return false;
-
-  int cmp2 = strcmp(p->_value, _value);
-  if (cmp2 != 0) return false;
-
-  return true;
-}
-
-void IdealGraphPrinter::print_xml(const char *value) {
-  size_t len = strlen(value);
-
-  char buf[2];
-  buf[1] = 0;
-  for (size_t i = 0; i < len; i++) {
-    char c = value[i];
-
-    switch(c) {
-      case '<':
-        output()->print("&lt;");
-        break;
-
-      case '>':
-        output()->print("&gt;");
-        break;
-
-      default:
-        buf[0] = c;
-        output()->print(buf);
-        break;
-    }
-  }
+  return _xml;
 }
 
 #endif
diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp
index b73493e..c4914f5 100644
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp
@@ -82,222 +82,42 @@
   static const char *METHOD_SHORT_NAME_PROPERTY;
   static const char *ASSEMBLY_ELEMENT;
 
-  class Property {
-
-  private:
-
-    const char *_name;
-    const char *_value;
-
-  public:
-
-    Property();
-    Property(const Property* p);
-    ~Property();
-    Property(const char *name, const char *value);
-    Property(const char *name, int value);
-    bool equals(Property* p);
-    void print(IdealGraphPrinter *printer);
-    void print_as_attribute(IdealGraphPrinter *printer);
-    bool is_null();
-    void clean();
-    const char *name();
-
-    static const char* dup(const char *str) {
-      char * copy = new char[strlen(str)+1];
-      strcpy(copy, str);
-      return copy;
-    }
-
-  };
-
-  class Properties {
-
-  private:
-
-    GrowableArray<Property *> *list;
-
-  public:
-
-    Properties();
-    ~Properties();
-    void add(Property *p);
-    void remove(const char *name);
-    bool equals(Properties* p);
-    void print(IdealGraphPrinter *printer);
-    void print_as_attributes(IdealGraphPrinter *printer);
-    void clean();
-
-  };
-
-
-  class Description {
-
-  private:
-
-    State _state;
-
-  public:
-
-    Description();
-
-    State state();
-    void set_state(State s);
-    void print(IdealGraphPrinter *printer);
-    virtual void print_changed(IdealGraphPrinter *printer) = 0;
-    virtual void print_removed(IdealGraphPrinter *printer) = 0;
-
-  };
-
-  class NodeDescription : public Description{
-
-  public:
-
-    static int count;
-
-  private:
-
-    GrowableArray<NodeDescription *> _succs;
-    int _block_index;
-    uintptr_t _id;
-    Properties _properties;
-    Node* _node;
-
-  public:
-
-    NodeDescription(Node* node);
-    ~NodeDescription();
-    Node* node();
-
-    // void set_node(Node* node);
-    GrowableArray<NodeDescription *>* succs();
-    void init_succs();
-    void clear_succs();
-    void add_succ(NodeDescription *desc);
-    int block_index();
-    void set_block_index(int i);
-    Properties* properties();
-    virtual void print_changed(IdealGraphPrinter *printer);
-    virtual void print_removed(IdealGraphPrinter *printer);
-    bool equals(NodeDescription *desc);
-    uint id();
-
-  };
-
-  class Block {
-
-  private:
-
-    NodeDescription *_start;
-    NodeDescription *_proj;
-    GrowableArray<int> _succs;
-    GrowableArray<NodeDescription *> _nodes;
-    GrowableArray<int> _dominates;
-    GrowableArray<int> _children;
-    int _semi;
-    int _parent;
-    GrowableArray<int> _pred;
-    GrowableArray<int> _bucket;
-    int _index;
-    int _dominator;
-    int _ancestor;
-    int _label;
-
-  public:
-
-    Block();
-    Block(int index);
-
-    void add_node(NodeDescription *n);
-    GrowableArray<NodeDescription *>* nodes();
-    GrowableArray<int>* children();
-    void add_child(int i);
-    void add_succ(int index);
-    GrowableArray<int>* succs();
-    GrowableArray<int>* dominates();
-    void add_dominates(int i);
-    NodeDescription *start();
-    NodeDescription *proj();
-    void set_start(NodeDescription *n);
-    void set_proj(NodeDescription *n);
-
-    int label();
-    void set_label(int i);
-    int ancestor();
-    void set_ancestor(int i);
-    int index();
-    int dominator();
-    void set_dominator(int i);
-    int parent();
-    void set_parent(int i);
-    int semi();
-    GrowableArray<int>* bucket();
-    void add_to_bucket(int i);
-    void clear_bucket();
-    GrowableArray<int>* pred();
-    void set_semi(int i);
-    void add_pred(int i);
-
-  };
-
-  class EdgeDescription : public Description {
-
-  private:
-
-    int _from;
-    int _to;
-    int _index;
-  public:
-
-    EdgeDescription(int from, int to, int index);
-    ~EdgeDescription();
-
-    virtual void print_changed(IdealGraphPrinter *printer);
-    virtual void print_removed(IdealGraphPrinter *printer);
-    bool equals(EdgeDescription *desc);
-    int from();
-    int to();
-  };
-
+  elapsedTimer _walk_time;
+  elapsedTimer _output_time;
+  elapsedTimer _build_blocks_time;
 
   static int _file_count;
   networkStream *_stream;
+  xmlStream *_xml;
   outputStream *_output;
   ciMethod *_current_method;
-  GrowableArray<NodeDescription *> _nodes;
-  GrowableArray<EdgeDescription *> _edges;
   int _depth;
-  Arena *_arena;
   char buffer[128];
   bool _should_send_method;
   PhaseChaitin* _chaitin;
-  bool _clear_nodes;
-  Matcher* _matcher;
   bool _traverse_outs;
-
-  void start_element_helper(const char *name, Properties *properties, bool endElement, bool print_indent = false, bool print_return = true);
-  NodeDescription *create_node_description(Node* node);
+  Compile *C;
 
   static void pre_node(Node* node, void *env);
   static void post_node(Node* node, void *env);
 
-  void schedule_latest(int **common_dominator, GrowableArray<Block>* blocks);
-  void build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks);
-  void compress(int index, GrowableArray<Block>* blocks);
-  int eval(int index, GrowableArray<Block>* blocks);
-  void link(int index1, int index2, GrowableArray<Block>* blocks);
-  void build_dominators(GrowableArray<Block>* blocks);
-  void build_blocks(Node *node);
-  void walk(Node *n);
-  void start_element(const char *name, Properties *properties = NULL, bool print_indent = false, bool print_return = true);
-  void simple_element(const char *name, Properties *properties = NULL, bool print_indent = false);
-  void end_element(const char *name, bool print_indent = false, bool print_return = true);
-  void print_edge(int from, int to, int index);
   void print_indent();
   void print_method(ciMethod *method, int bci, InlineTree *tree);
   void print_inline_tree(InlineTree *tree);
-  void clear_nodes();
-
+  void visit_node(Node *n, void *param);
+  void walk_nodes(Node *start, void *param);
+  void begin_elem(const char *s);
+  void end_elem();
+  void begin_head(const char *s);
+  void end_head();
+  void print_attr(const char *name, const char *val);
+  void print_attr(const char *name, intptr_t val);
+  void print_prop(const char *name, const char *val);
+  void print_prop(const char *name, int val);
+  void tail(const char *name);
+  void head(const char *name);
+  void text(const char *s);
+  intptr_t get_node_id(Node *n);
   IdealGraphPrinter();
   ~IdealGraphPrinter();
 
@@ -308,7 +128,6 @@
 
   bool traverse_outs();
   void set_traverse_outs(bool b);
-  void print_ifg(PhaseIFG* ifg);
   outputStream *output();
   void print_inlining(Compile* compile);
   void begin_method(Compile* compile);
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index b94c0f1..52707d0 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -2194,14 +2194,15 @@
     pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT);
 #ifdef _LP64
     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
+      Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
+      Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
       cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr,
-                                                           EncodePNode::encode(&_gvn, newval),
-                                                           EncodePNode::encode(&_gvn, oldval)));
+                                                          newval_enc, oldval_enc));
     } else
 #endif
-      {
-        cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
-      }
+    {
+      cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
+    }
     post_barrier(control(), cas, base, adr, alias_idx, newval, T_OBJECT, true);
     break;
   default:
diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp
index ba881ec..dbce258 100644
--- a/hotspot/src/share/vm/opto/loopTransform.cpp
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp
@@ -690,7 +690,7 @@
   // (the main-loop trip-counter exit value) because we will be changing
   // the exit value (via unrolling) so we cannot constant-fold away the zero
   // trip guard until all unrolling is done.
-  Node *zer_opaq = new (C, 2) Opaque1Node(incr);
+  Node *zer_opaq = new (C, 2) Opaque1Node(C, incr);
   Node *zer_cmp  = new (C, 3) CmpINode( zer_opaq, limit );
   Node *zer_bol  = new (C, 2) BoolNode( zer_cmp, b_test );
   register_new_node( zer_opaq, new_main_exit );
@@ -760,7 +760,7 @@
   // pre-loop, the main-loop may not execute at all.  Later in life this
   // zero-trip guard will become the minimum-trip guard when we unroll
   // the main-loop.
-  Node *min_opaq = new (C, 2) Opaque1Node(limit);
+  Node *min_opaq = new (C, 2) Opaque1Node(C, limit);
   Node *min_cmp  = new (C, 3) CmpINode( pre_incr, min_opaq );
   Node *min_bol  = new (C, 2) BoolNode( min_cmp, b_test );
   register_new_node( min_opaq, new_pre_exit );
@@ -810,7 +810,7 @@
 
   // Save the original loop limit in this Opaque1 node for
   // use by range check elimination.
-  Node *pre_opaq  = new (C, 3) Opaque1Node(pre_limit, limit);
+  Node *pre_opaq  = new (C, 3) Opaque1Node(C, pre_limit, limit);
 
   register_new_node( pre_limit, pre_head->in(0) );
   register_new_node( pre_opaq , pre_head->in(0) );
diff --git a/hotspot/src/share/vm/opto/loopUnswitch.cpp b/hotspot/src/share/vm/opto/loopUnswitch.cpp
index 10d145e..2a385e7 100644
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp
@@ -205,7 +205,7 @@
 
   Node *cont      = _igvn.intcon(1);
   set_ctrl(cont, C->root());
-  Node* opq       = new (C, 2) Opaque1Node(cont);
+  Node* opq       = new (C, 2) Opaque1Node(C, cont);
   register_node(opq, outer_loop, entry, dom_depth(entry));
   Node *bol       = new (C, 2) Conv2BNode(opq);
   register_node(bol, outer_loop, entry, dom_depth(entry));
diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp
index 8230cae..c411cdc 100644
--- a/hotspot/src/share/vm/opto/loopnode.cpp
+++ b/hotspot/src/share/vm/opto/loopnode.cpp
@@ -1072,8 +1072,6 @@
       phase->_igvn.add_users_to_worklist(l->fast_out(i));
   }
 
-  phase->C->print_method("After beautify loops", 3);
-
   // Now recursively beautify nested loops
   if( _child ) result |= _child->beautify_loops( phase );
   if( _next  ) result |= _next ->beautify_loops( phase );
@@ -1470,6 +1468,8 @@
       }
       // Reset loop nesting depth
       _ltree_root->set_nest( 0 );
+
+      C->print_method("After beautify loops", 3);
     }
   }
 
diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp
index 471eb07..f7fa3f2 100644
--- a/hotspot/src/share/vm/opto/loopopts.cpp
+++ b/hotspot/src/share/vm/opto/loopopts.cpp
@@ -41,7 +41,7 @@
   const Type* type = n->bottom_type();
   const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr();
   Node *phi;
-  if( t_oop != NULL && t_oop->is_instance_field() ) {
+  if( t_oop != NULL && t_oop->is_known_instance_field() ) {
     int iid    = t_oop->instance_id();
     int index  = C->get_alias_index(t_oop);
     int offset = t_oop->offset();
@@ -2685,7 +2685,7 @@
       if( !cle->stride_is_con() ) continue;
       // Hit!  Refactor use to use the post-incremented tripcounter.
       // Compute a post-increment tripcounter.
-      Node *opaq = new (C, 2) Opaque2Node( cle->incr() );
+      Node *opaq = new (C, 2) Opaque2Node( C, cle->incr() );
       register_new_node( opaq, u_ctrl );
       Node *neg_stride = _igvn.intcon(-cle->stride_con());
       set_ctrl(neg_stride, C->root());
diff --git a/hotspot/src/share/vm/opto/machnode.cpp b/hotspot/src/share/vm/opto/machnode.cpp
index 2875308..eadd0da 100644
--- a/hotspot/src/share/vm/opto/machnode.cpp
+++ b/hotspot/src/share/vm/opto/machnode.cpp
@@ -262,17 +262,19 @@
     // Now we have collected every part of the ADLC MEMORY_INTER.
     // See if it adds up to a base + offset.
     if (index != NULL) {
-      if (!index->is_Con()) {
-        const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
-        if (narrowoop != NULL) {
-          // Memory references through narrow oops have a
-          // funny base so grab the type from the index.
-          adr_type = narrowoop->make_oopptr();
-          return NULL;
-        }
+      const Type* t_index = index->bottom_type();
+      if (t_index->isa_narrowoop()) { // EncodeN, LoadN, LoadConN, LoadNKlass.
+        // Memory references through narrow oops have a
+        // funny base so grab the type from the index:
+        // [R12 + narrow_oop_reg<<3 + offset]
+        assert(base == NULL, "Memory references through narrow oops have no base");
+        offset = disp;
+        adr_type = t_index->make_ptr()->add_offset(offset);
+        return NULL;
+      } else if (!index->is_Con()) {
         disp = Type::OffsetBot;
       } else if (disp != Type::OffsetBot) {
-        const TypeX* ti = index->bottom_type()->isa_intptr_t();
+        const TypeX* ti = t_index->isa_intptr_t();
         if (ti == NULL) {
           disp = Type::OffsetBot;  // a random constant??
         } else {
diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp
index 1d4b1f3..cd38a4b 100644
--- a/hotspot/src/share/vm/opto/macro.cpp
+++ b/hotspot/src/share/vm/opto/macro.cpp
@@ -320,9 +320,9 @@
 
 // Search the last value stored into the object's field.
 Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) {
-  assert(adr_t->is_instance_field(), "instance required");
-  uint instance_id = adr_t->instance_id();
-  assert(instance_id == alloc->_idx, "wrong allocation");
+  assert(adr_t->is_known_instance_field(), "instance required");
+  int instance_id = adr_t->instance_id();
+  assert((uint)instance_id == alloc->_idx, "wrong allocation");
 
   int alias_idx = C->get_alias_index(adr_t);
   int offset = adr_t->offset();
@@ -354,7 +354,7 @@
       const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr();
       assert(atype != NULL, "address type must be oopptr");
       assert(C->get_alias_index(atype) == alias_idx &&
-             atype->is_instance_field() && atype->offset() == offset &&
+             atype->is_known_instance_field() && atype->offset() == offset &&
              atype->instance_id() == instance_id, "store is correct memory slice");
       done = true;
     } else if (mem->is_Phi()) {
@@ -598,7 +598,7 @@
           field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
         }
         if (UseCompressedOops) {
-          field_type = field_type->is_oopptr()->make_narrowoop();
+          field_type = field_type->make_narrowoop();
           basic_elem_type = T_NARROWOOP;
         }
       } else {
@@ -666,9 +666,11 @@
       if (UseCompressedOops && field_type->isa_narrowoop()) {
         // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation
         // to be able scalar replace the allocation.
-        _igvn.set_delay_transform(false);
-        field_val = DecodeNNode::decode(&_igvn, field_val);
-        _igvn.set_delay_transform(true);
+        if (field_val->is_EncodeP()) {
+          field_val = field_val->in(1);
+        } else {
+          field_val = transform_later(new (C, 2) DecodeNNode(field_val, field_val->bottom_type()->make_ptr()));
+        }
       }
       sfpt->add_req(field_val);
     }
@@ -1674,7 +1676,14 @@
         success = eliminate_locking_node(n->as_AbstractLock());
         break;
       default:
-        assert(false, "unknown node type in macro list");
+        if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) {
+          _igvn.add_users_to_worklist(n);
+          _igvn.hash_delete(n);
+          _igvn.subsume_node(n, n->in(1));
+          success = true;
+        } else {
+          assert(false, "unknown node type in macro list");
+        }
       }
       assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
       progress = progress || success;
diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp
index 40bec7c..1640b28 100644
--- a/hotspot/src/share/vm/opto/matcher.cpp
+++ b/hotspot/src/share/vm/opto/matcher.cpp
@@ -51,6 +51,7 @@
   PhaseTransform( Phase::Ins_Select ),
 #ifdef ASSERT
   _old2new_map(C->comp_arena()),
+  _new2old_map(C->comp_arena()),
 #endif
   _shared_nodes(C->comp_arena()),
   _reduceOp(reduceOp), _leftOp(leftOp), _rightOp(rightOp),
@@ -82,6 +83,7 @@
   idealreg2debugmask[Op_RegF] = NULL;
   idealreg2debugmask[Op_RegD] = NULL;
   idealreg2debugmask[Op_RegP] = NULL;
+  debug_only(_mem_node = NULL;)   // Ideal memory node consumed by mach node
 }
 
 //------------------------------warp_incoming_stk_arg------------------------
@@ -834,10 +836,16 @@
             if( n->is_Proj() && n->in(0)->is_Multi()) {       // Projections?
               // Convert to machine-dependent projection
               m = n->in(0)->as_Multi()->match( n->as_Proj(), this );
+#ifdef ASSERT
+              _new2old_map.map(m->_idx, n);
+#endif
               if (m->in(0) != NULL) // m might be top
                 collect_null_checks(m);
             } else {                // Else just a regular 'ol guy
               m = n->clone();       // So just clone into new-space
+#ifdef ASSERT
+              _new2old_map.map(m->_idx, n);
+#endif
               // Def-Use edges will be added incrementally as Uses
               // of this node are matched.
               assert(m->outcnt() == 0, "no Uses of this clone yet");
@@ -886,6 +894,9 @@
             // || op == Op_BoxLock  // %%%% enable this and remove (+++) in chaitin.cpp
             ) {
           m = m->clone();
+#ifdef ASSERT
+          _new2old_map.map(m->_idx, n);
+#endif
           mstack.push(m, Post_Visit, n, i); // Don't neet to visit
           mstack.push(m->in(0), Visit, m, 0);
         } else {
@@ -1153,7 +1164,10 @@
 
   // StoreNodes require their Memory input to match any LoadNodes
   Node *mem = n->is_Store() ? n->in(MemNode::Memory) : (Node*)1 ;
-
+#ifdef ASSERT
+  Node* save_mem_node = _mem_node;
+  _mem_node = n->is_Store() ? (Node*)n : NULL;
+#endif
   // State object for root node of match tree
   // Allocate it on _states_arena - stack allocation can cause stack overflow.
   State *s = new (&_states_arena) State;
@@ -1186,6 +1200,7 @@
   MachNode *m = ReduceInst( s, s->_rule[mincost], mem );
 #ifdef ASSERT
   _old2new_map.map(n->_idx, m);
+  _new2old_map.map(m->_idx, (Node*)n);
 #endif
 
   // Add any Matcher-ignored edges
@@ -1205,6 +1220,7 @@
     }
   }
 
+  debug_only( _mem_node = save_mem_node; )
   return m;
 }
 
@@ -1445,8 +1461,30 @@
   }
 
   // If a Memory was used, insert a Memory edge
-  if( mem != (Node*)1 )
+  if( mem != (Node*)1 ) {
     mach->ins_req(MemNode::Memory,mem);
+#ifdef ASSERT
+    // Verify adr type after matching memory operation
+    const MachOper* oper = mach->memory_operand();
+    if (oper != NULL && oper != (MachOper*)-1 &&
+        mach->adr_type() != TypeRawPtr::BOTTOM) { // non-direct addressing mode
+      // It has a unique memory operand.  Find corresponding ideal mem node.
+      Node* m = NULL;
+      if (leaf->is_Mem()) {
+        m = leaf;
+      } else {
+        m = _mem_node;
+        assert(m != NULL && m->is_Mem(), "expecting memory node");
+      }
+      if (m->adr_type() != mach->adr_type()) {
+        m->dump();
+        tty->print_cr("mach:");
+        mach->dump(1);
+      }
+      assert(m->adr_type() == mach->adr_type(), "matcher should not change adr type");
+    }
+#endif
+  }
 
   // If the _leaf is an AddP, insert the base edge
   if( leaf->is_AddP() )
@@ -1464,6 +1502,9 @@
     for( uint i=0; i<mach->req(); i++ ) {
       mach->set_req(i,NULL);
     }
+#ifdef ASSERT
+    _new2old_map.map(ex->_idx, s->_leaf);
+#endif
   }
 
   // PhaseChaitin::fixup_spills will sometimes generate spill code
@@ -1510,7 +1551,9 @@
     assert( newrule >= _LAST_MACH_OPER, "Do NOT chain from internal operand");
     mach->_opnds[1] = s->MachOperGenerator( _reduceOp[catch_op], C );
     Node *mem1 = (Node*)1;
+    debug_only(Node *save_mem_node = _mem_node;)
     mach->add_req( ReduceInst(s, newrule, mem1) );
+    debug_only(_mem_node = save_mem_node;)
   }
   return;
 }
@@ -1520,6 +1563,7 @@
   if( s->_leaf->is_Load() ) {
     Node *mem2 = s->_leaf->in(MemNode::Memory);
     assert( mem == (Node*)1 || mem == mem2, "multiple Memories being matched at once?" );
+    debug_only( if( mem == (Node*)1 ) _mem_node = s->_leaf;)
     mem = mem2;
   }
   if( s->_leaf->in(0) != NULL && s->_leaf->req() > 1) {
@@ -1563,7 +1607,9 @@
         //             --> ReduceInst( newrule )
         mach->_opnds[num_opnds++] = s->MachOperGenerator( _reduceOp[catch_op], C );
         Node *mem1 = (Node*)1;
+        debug_only(Node *save_mem_node = _mem_node;)
         mach->add_req( ReduceInst( newstate, newrule, mem1 ) );
+        debug_only(_mem_node = save_mem_node;)
       }
     }
     assert( mach->_opnds[num_opnds-1], "" );
@@ -1594,6 +1640,7 @@
   if( s->_leaf->is_Load() ) {
     assert( mem == (Node*)1, "multiple Memories being matched at once?" );
     mem = s->_leaf->in(MemNode::Memory);
+    debug_only(_mem_node = s->_leaf;)
   }
   if( s->_leaf->in(0) && s->_leaf->req() > 1) {
     if( !mach->in(0) )
@@ -1618,7 +1665,9 @@
       // Reduce the instruction, and add a direct pointer from this
       // machine instruction to the newly reduced one.
       Node *mem1 = (Node*)1;
+      debug_only(Node *save_mem_node = _mem_node;)
       mach->add_req( ReduceInst( kid, newrule, mem1 ) );
+      debug_only(_mem_node = save_mem_node;)
     }
   }
 }
@@ -1731,8 +1780,8 @@
       }
       case Op_ConN: {  // Convert narrow pointers above the centerline to NUL
         TypeNode *tn = n->as_Type(); // Constants derive from type nodes
-        const TypePtr* tp = tn->type()->is_narrowoop()->make_oopptr();
-        if (tp->_ptr == TypePtr::AnyNull) {
+        const TypePtr* tp = tn->type()->make_ptr();
+        if (tp && tp->_ptr == TypePtr::AnyNull) {
           tn->set_type(TypeNarrowOop::NULL_PTR);
         }
         break;
diff --git a/hotspot/src/share/vm/opto/matcher.hpp b/hotspot/src/share/vm/opto/matcher.hpp
index 00f18ea..20de817 100644
--- a/hotspot/src/share/vm/opto/matcher.hpp
+++ b/hotspot/src/share/vm/opto/matcher.hpp
@@ -84,6 +84,7 @@
   Node_Array _shared_nodes;
 
   debug_only(Node_Array _old2new_map;)   // Map roots of ideal-trees to machine-roots
+  debug_only(Node_Array _new2old_map;)   // Maps machine nodes back to ideal
 
   // Accessors for the inherited field PhaseTransform::_nodes:
   void   grow_new_node_array(uint idx_limit) {
@@ -104,6 +105,8 @@
 #ifdef ASSERT
   // Make sure only new nodes are reachable from this node
   void verify_new_nodes_only(Node* root);
+
+  Node* _mem_node;   // Ideal memory node consumed by mach node
 #endif
 
 public:
@@ -388,5 +391,9 @@
 
 #ifdef ASSERT
   void dump_old2new_map();      // machine-independent to machine-dependent
+
+  Node* find_old_node(Node* new_node) {
+    return _new2old_map[new_node->_idx];
+  }
 #endif
 };
diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp
index 84757b6..5015d99 100644
--- a/hotspot/src/share/vm/opto/memnode.cpp
+++ b/hotspot/src/share/vm/opto/memnode.cpp
@@ -91,7 +91,7 @@
 
 Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
   const TypeOopPtr *tinst = t_adr->isa_oopptr();
-  if (tinst == NULL || !tinst->is_instance_field())
+  if (tinst == NULL || !tinst->is_known_instance_field())
     return mchain;  // don't try to optimize non-instance types
   uint instance_id = tinst->instance_id();
   Node *prev = NULL;
@@ -125,7 +125,7 @@
 
 Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
   const TypeOopPtr *t_oop = t_adr->isa_oopptr();
-  bool is_instance = (t_oop != NULL) && t_oop->is_instance_field();
+  bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field();
   PhaseIterGVN *igvn = phase->is_IterGVN();
   Node *result = mchain;
   result = optimize_simple_memory_chain(result, t_adr, phase);
@@ -134,8 +134,8 @@
     assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
     const TypePtr *t = mphi->adr_type();
     if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
-        t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
-        t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop) {
+        t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+        t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) {
       // clone the Phi with our address type
       result = mphi->split_out_instance(t_adr, igvn);
     } else {
@@ -470,7 +470,7 @@
         return mem;         // let caller handle steps (c), (d)
       }
 
-    } else if (addr_t != NULL && addr_t->is_instance_field()) {
+    } else if (addr_t != NULL && addr_t->is_known_instance_field()) {
       // Can't use optimize_simple_memory_chain() since it needs PhaseGVN.
       if (mem->is_Proj() && mem->in(0)->is_Call()) {
         CallNode *call = mem->in(0)->as_Call();
@@ -769,15 +769,8 @@
   case T_OBJECT:
 #ifdef _LP64
     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
-      const TypeNarrowOop* narrowtype;
-      if (rt->isa_narrowoop()) {
-        narrowtype = rt->is_narrowoop();
-      } else {
-        narrowtype = rt->is_oopptr()->make_narrowoop();
-      }
-      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype));
-
-      return DecodeNNode::decode(&gvn, load);
+      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop()));
+      return new (C, 2) DecodeNNode(load, load->bottom_type()->make_ptr());
     } else
 #endif
     {
@@ -923,7 +916,7 @@
       in(MemNode::Address)->is_AddP() ) {
     const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr();
     // Only instances.
-    if( t_oop != NULL && t_oop->is_instance_field() &&
+    if( t_oop != NULL && t_oop->is_known_instance_field() &&
         t_oop->offset() != Type::OffsetBot &&
         t_oop->offset() != Type::OffsetTop) {
       return true;
@@ -1146,7 +1139,7 @@
   const TypeOopPtr *t_oop = addr_t->isa_oopptr();
 
   assert(mem->is_Phi() && (t_oop != NULL) &&
-         t_oop->is_instance_field(), "invalide conditions");
+         t_oop->is_known_instance_field(), "invalide conditions");
 
   Node *region = mem->in(0);
   if (region == NULL) {
@@ -1314,7 +1307,7 @@
     }
     const TypeOopPtr *t_oop = addr_t->isa_oopptr();
     if (can_reshape && opt_mem->is_Phi() &&
-        (t_oop != NULL) && t_oop->is_instance_field()) {
+        (t_oop != NULL) && t_oop->is_known_instance_field()) {
       // Split instance field load through Phi.
       Node* result = split_through_phi(phase);
       if (result != NULL) return result;
@@ -1549,7 +1542,7 @@
   }
 
   const TypeOopPtr *tinst = tp->isa_oopptr();
-  if (tinst != NULL && tinst->is_instance_field()) {
+  if (tinst != NULL && tinst->is_known_instance_field()) {
     // If we have an instance type and our memory input is the
     // programs's initial memory state, there is no matching store,
     // so just return a zero of the appropriate type
@@ -1631,9 +1624,8 @@
   assert(adr_type != NULL, "expecting TypeOopPtr");
 #ifdef _LP64
   if (adr_type->is_ptr_to_narrowoop()) {
-    const TypeNarrowOop* narrowtype = tk->is_oopptr()->make_narrowoop();
-    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, narrowtype));
-    return DecodeNNode::decode(&gvn, load_klass);
+    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop()));
+    return new (C, 2) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr());
   }
 #endif
   assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
@@ -1843,15 +1835,10 @@
 //------------------------------Value------------------------------------------
 const Type *LoadNKlassNode::Value( PhaseTransform *phase ) const {
   const Type *t = klass_value_common(phase);
+  if (t == Type::TOP)
+    return t;
 
-  if (t == TypePtr::NULL_PTR) {
-    return TypeNarrowOop::NULL_PTR;
-  }
-  if (t != Type::TOP && !t->isa_narrowoop()) {
-    assert(t->is_oopptr(), "sanity");
-    t = t->is_oopptr()->make_narrowoop();
-  }
-  return t;
+  return t->make_narrowoop();
 }
 
 //------------------------------Identity---------------------------------------
@@ -1864,7 +1851,7 @@
   if( t == Type::TOP ) return x;
   if( t->isa_narrowoop()) return x;
 
-  return EncodePNode::encode(phase, x);
+  return phase->transform(new (phase->C, 2) EncodePNode(x, t->make_narrowoop()));
 }
 
 //------------------------------Value-----------------------------------------
@@ -1930,14 +1917,13 @@
     if (adr->bottom_type()->is_ptr_to_narrowoop() ||
         (UseCompressedOops && val->bottom_type()->isa_klassptr() &&
          adr->bottom_type()->isa_rawptr())) {
-      const TypePtr* type = val->bottom_type()->is_ptr();
-      Node* cp = EncodePNode::encode(&gvn, val);
-      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp);
+      val = gvn.transform(new (C, 2) EncodePNode(val, val->bottom_type()->make_narrowoop()));
+      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, val);
     } else
 #endif
-      {
-        return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
-      }
+    {
+      return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
+    }
   }
   ShouldNotReachHere();
   return (StoreNode*)NULL;
@@ -2151,7 +2137,7 @@
   const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr();
   if (adr_oop == NULL)
     return false;
-  if (!adr_oop->is_instance_field())
+  if (!adr_oop->is_known_instance_field())
     return false; // if not a distinct instance, there may be aliases of the address
   for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) {
     Node *use = adr->fast_out(i);
diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp
index 845d550..df3e56c 100644
--- a/hotspot/src/share/vm/opto/node.cpp
+++ b/hotspot/src/share/vm/opto/node.cpp
@@ -1387,7 +1387,7 @@
   }
 #ifdef ASSERT
   // Search along debug_orig edges last:
-  for (Node* orig = n->debug_orig(); orig != NULL; orig = orig->debug_orig()) {
+  for (Node* orig = n->debug_orig(); orig != NULL && n != orig; orig = orig->debug_orig()) {
     if (NotANode(orig))  break;
     find_recur( result, orig, idx, only_ctrl, old_space, new_space );
   }
diff --git a/hotspot/src/share/vm/opto/output.cpp b/hotspot/src/share/vm/opto/output.cpp
index dcda4a8..64bf38f 100644
--- a/hotspot/src/share/vm/opto/output.cpp
+++ b/hotspot/src/share/vm/opto/output.cpp
@@ -447,6 +447,7 @@
             // We've got a winner.  Replace this branch.
             MachNode *replacement = mach->short_branch_version(this);
             b->_nodes.map(j, replacement);
+            mach->subsume_by(replacement);
 
             // Update the jmp_end size to save time in our
             // next pass.
diff --git a/hotspot/src/share/vm/opto/parse2.cpp b/hotspot/src/share/vm/opto/parse2.cpp
index 218cd4e..b3e0a9a 100644
--- a/hotspot/src/share/vm/opto/parse2.cpp
+++ b/hotspot/src/share/vm/opto/parse2.cpp
@@ -67,12 +67,9 @@
   const Type*       elemtype = arytype->elem();
 
   if (UseUniqueSubclasses && result2 != NULL) {
-    const Type* el = elemtype;
-    if (elemtype->isa_narrowoop()) {
-      el = elemtype->is_narrowoop()->make_oopptr();
-    }
-    const TypeInstPtr* toop = el->isa_instptr();
-    if (toop) {
+    const Type* el = elemtype->make_ptr();
+    if (el && el->isa_instptr()) {
+      const TypeInstPtr* toop = el->is_instptr();
       if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) {
         // If we load from "AbstractClass[]" we must see "ConcreteSubClass".
         const Type* subklass = Type::get_const_type(toop->klass());
@@ -2223,7 +2220,7 @@
     sprintf(buffer, "Bytecode %d: %s", bci(), Bytecodes::name(bc()));
     bool old = printer->traverse_outs();
     printer->set_traverse_outs(true);
-    printer->print_method(C, buffer, 3);
+    printer->print_method(C, buffer, 4);
     printer->set_traverse_outs(old);
   }
 #endif
diff --git a/hotspot/src/share/vm/opto/subnode.cpp b/hotspot/src/share/vm/opto/subnode.cpp
index b9d6e47..90ad087 100644
--- a/hotspot/src/share/vm/opto/subnode.cpp
+++ b/hotspot/src/share/vm/opto/subnode.cpp
@@ -45,10 +45,13 @@
     return in(2)->in(2);
   }
 
-  // Convert "(X+Y) - Y" into X
+  // Convert "(X+Y) - Y" into X and "(X+Y) - X" into Y
   if( in(1)->Opcode() == Op_AddI ) {
     if( phase->eqv(in(1)->in(2),in(2)) )
       return in(1)->in(1);
+    if (phase->eqv(in(1)->in(1),in(2)))
+      return in(1)->in(2);
+
     // Also catch: "(X + Opaque2(Y)) - Y".  In this case, 'Y' is a loop-varying
     // trip counter and X is likely to be loop-invariant (that's how O2 Nodes
     // are originally used, although the optimizer sometimes jiggers things).
@@ -740,8 +743,8 @@
 // Simplify an CmpN (compare 2 pointers) node, based on local information.
 // If both inputs are constants, compare them.
 const Type *CmpNNode::sub( const Type *t1, const Type *t2 ) const {
-  const TypePtr *r0 = t1->is_narrowoop()->make_oopptr(); // Handy access
-  const TypePtr *r1 = t2->is_narrowoop()->make_oopptr();
+  const TypePtr *r0 = t1->make_ptr(); // Handy access
+  const TypePtr *r1 = t2->make_ptr();
 
   // Undefined inputs makes for an undefined result
   if( TypePtr::above_centerline(r0->_ptr) ||
diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp
index 0f24236..593d5dd 100644
--- a/hotspot/src/share/vm/opto/superword.cpp
+++ b/hotspot/src/share/vm/opto/superword.cpp
@@ -1424,9 +1424,9 @@
 //---------------------------container_type---------------------------
 // Smallest type containing range of values
 const Type* SuperWord::container_type(const Type* t) {
-  if (t->isa_narrowoop()) t = t->is_narrowoop()->make_oopptr();
-  if (t->isa_aryptr()) {
-    t = t->is_aryptr()->elem();
+  const Type* tp = t->make_ptr();
+  if (tp && tp->isa_aryptr()) {
+    t = tp->is_aryptr()->elem();
   }
   if (t->basic_type() == T_INT) {
     if (t->higher_equal(TypeInt::BOOL))  return TypeInt::BOOL;
diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp
index 961d707..bb6c959 100644
--- a/hotspot/src/share/vm/opto/type.cpp
+++ b/hotspot/src/share/vm/opto/type.cpp
@@ -491,14 +491,8 @@
 // commutative and the lattice is symmetric.
 const Type *Type::meet( const Type *t ) const {
   if (isa_narrowoop() && t->isa_narrowoop()) {
-    const Type* result = is_narrowoop()->make_oopptr()->meet(t->is_narrowoop()->make_oopptr());
-    if (result->isa_oopptr()) {
-      return result->isa_oopptr()->make_narrowoop();
-    } else if (result == TypePtr::NULL_PTR) {
-      return TypeNarrowOop::NULL_PTR;
-    } else {
-      return result;
-    }
+    const Type* result = make_ptr()->meet(t->make_ptr());
+    return result->make_narrowoop();
   }
 
   const Type *mt = xmeet(t);
@@ -520,23 +514,8 @@
     bool    t_interface =    t_inst->klass()->is_interface();
     interface_vs_oop = this_interface ^ t_interface;
   }
-  const Type *tdual = t->_dual;
-  const Type *thisdual = _dual;
-  // strip out instances
-  if (t2t->isa_oopptr() != NULL) {
-    t2t = t2t->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (t2this->isa_oopptr() != NULL) {
-    t2this = t2this->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (tdual->isa_oopptr() != NULL) {
-    tdual = tdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (thisdual->isa_oopptr() != NULL) {
-    thisdual = thisdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
 
-  if( !interface_vs_oop && (t2t != tdual || t2this != thisdual) ) {
+  if( !interface_vs_oop && (t2t != t->_dual || t2this != _dual) ) {
     tty->print_cr("=== Meet Not Symmetric ===");
     tty->print("t   =                   ");         t->dump(); tty->cr();
     tty->print("this=                   ");            dump(); tty->cr();
@@ -1764,7 +1743,7 @@
 //------------------------------make-------------------------------------------
 const TypeAry *TypeAry::make( const Type *elem, const TypeInt *size) {
   if (UseCompressedOops && elem->isa_oopptr()) {
-    elem = elem->is_oopptr()->make_narrowoop();
+    elem = elem->make_narrowoop();
   }
   size = normalize_array_size(size);
   return (TypeAry*)(new TypeAry(elem,size))->hashcons();
@@ -1849,9 +1828,8 @@
   if (_elem == BOTTOM)      return false;  // general array not exact
   if (_elem == TOP   )      return false;  // inverted general array not exact
   const TypeOopPtr*  toop = NULL;
-  if (UseCompressedOops) {
-    const TypeNarrowOop* noop = _elem->isa_narrowoop();
-    if (noop) toop = noop->make_oopptr()->isa_oopptr();
+  if (UseCompressedOops && _elem->isa_narrowoop()) {
+    toop = _elem->make_ptr()->isa_oopptr();
   } else {
     toop = _elem->isa_oopptr();
   }
@@ -1861,16 +1839,18 @@
   if (!tklass->is_loaded()) return false;  // unloaded class
   const TypeInstPtr* tinst;
   if (_elem->isa_narrowoop())
-    tinst = _elem->is_narrowoop()->make_oopptr()->isa_instptr();
+    tinst = _elem->make_ptr()->isa_instptr();
   else
     tinst = _elem->isa_instptr();
-  if (tinst)                return tklass->as_instance_klass()->is_final();
+  if (tinst)
+    return tklass->as_instance_klass()->is_final();
   const TypeAryPtr*  tap;
   if (_elem->isa_narrowoop())
-    tap = _elem->is_narrowoop()->make_oopptr()->isa_aryptr();
+    tap = _elem->make_ptr()->isa_aryptr();
   else
     tap = _elem->isa_aryptr();
-  if (tap)                  return tap->ary()->ary_must_be_exact();
+  if (tap)
+    return tap->ary()->ary_must_be_exact();
   return false;
 }
 
@@ -2227,7 +2207,7 @@
   ciKlass*  k = ciKlassKlass::make();
   bool      xk = false;
   ciObject* o = NULL;
-  return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, UNKNOWN_INSTANCE))->hashcons();
+  return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons();
 }
 
 
@@ -2239,7 +2219,7 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeOopPtr::cast_to_instance(int instance_id) const {
+const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
   // There are no instances of a general oop.
   // Return self unchanged.
   return this;
@@ -2333,7 +2313,7 @@
 const Type *TypeOopPtr::xdual() const {
   assert(klass() == ciKlassKlass::make(), "no klasses here");
   assert(const_oop() == NULL,             "no constants here");
-  return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance()  );
+  return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id()  );
 }
 
 //--------------------------make_from_klass_common-----------------------------
@@ -2547,7 +2527,9 @@
   case         0: break;
   default:        st->print("+%d",_offset); break;
   }
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -2579,20 +2561,24 @@
   return make( _ptr, xadd_offset(offset) );
 }
 
-const TypeNarrowOop* TypeOopPtr::make_narrowoop() const {
-  return TypeNarrowOop::make(this);
+//------------------------------meet_instance_id--------------------------------
+int TypeOopPtr::meet_instance_id( int instance_id ) const {
+  // Either is 'TOP' instance?  Return the other instance!
+  if( _instance_id == InstanceTop ) return  instance_id;
+  if(  instance_id == InstanceTop ) return _instance_id;
+  // If either is different, return 'BOTTOM' instance
+  if( _instance_id != instance_id ) return InstanceBot;
+  return _instance_id;
 }
 
-int TypeOopPtr::meet_instance(int iid) const {
-  if (iid == 0) {
-    return (_instance_id < 0)  ? _instance_id : UNKNOWN_INSTANCE;
-  } else if (_instance_id == UNKNOWN_INSTANCE) {
-    return (iid < 0)  ? iid : UNKNOWN_INSTANCE;
-  } else {
-    return (_instance_id == iid) ? iid : UNKNOWN_INSTANCE;
-  }
+//------------------------------dual_instance_id--------------------------------
+int TypeOopPtr::dual_instance_id( ) const {
+  if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM
+  if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP
+  return _instance_id;              // Map everything else into self
 }
 
+
 //=============================================================================
 // Convenience common pre-built types.
 const TypeInstPtr *TypeInstPtr::NOTNULL;
@@ -2624,7 +2610,7 @@
   // Ptr is never Null
   assert( ptr != Null, "NULL pointers are not typed" );
 
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = false;
   if (ptr == Constant) {
@@ -2649,7 +2635,7 @@
   if( ptr == _ptr ) return this;
   // Reconstruct _sig info here since not a problem with later lazy
   // construction, _sig will show up on demand.
-  return make(ptr, klass(), klass_is_exact(), const_oop(), _offset);
+  return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id);
 }
 
 
@@ -2665,13 +2651,13 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeInstPtr::cast_to_instance(int instance_id) const {
-  if( instance_id == _instance_id) return this;
-  bool exact = true;
-  PTR  ptr_t = NotNull;
-  if (instance_id == UNKNOWN_INSTANCE) {
-    exact = _klass_is_exact;
-    ptr_t = _ptr;
+const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const {
+  if( instance_id == _instance_id ) return this;
+  bool exact = _klass_is_exact;
+  PTR  ptr_t = _ptr;
+  if ( instance_id > 0 ) { // instances are always exactly typed
+    if (UseExactTypes) exact = true;
+    ptr_t = NotNull;
   }
   return make(ptr_t, klass(), exact, const_oop(), _offset, instance_id);
 }
@@ -2754,16 +2740,17 @@
     const TypeAryPtr *tp = t->is_aryptr();
     int offset = meet_offset(tp->offset());
     PTR ptr = meet_ptr(tp->ptr());
-    int iid = meet_instance(tp->instance_id());
+    int instance_id = meet_instance_id(tp->instance_id());
     switch (ptr) {
     case TopPTR:
     case AnyNull:                // Fall 'down' to dual of object klass
       if (klass()->equals(ciEnv::current()->Object_klass())) {
-        return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+        return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
       } else {
         // cannot subclass, so the meet has to fall badly below the centerline
         ptr = NotNull;
-        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid);
+        instance_id = InstanceBot;
+        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id);
       }
     case Constant:
     case NotNull:
@@ -2774,14 +2761,15 @@
         // then we can subclass in the Java class heirarchy.
         if (klass()->equals(ciEnv::current()->Object_klass())) {
           // that is, tp's array type is a subtype of my klass
-          return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+          return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
         }
       }
       // The other case cannot happen, since I cannot be a subtype of an array.
       // The meet falls down to Object class below centerline.
       if( ptr == Constant )
          ptr = NotNull;
-      return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid );
+      instance_id = InstanceBot;
+      return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id );
     default: typerr(t);
     }
   }
@@ -2793,9 +2781,11 @@
     PTR ptr = meet_ptr(tp->ptr());
     switch (tp->ptr()) {
     case TopPTR:
-    case AnyNull:
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
       return make(ptr, klass(), klass_is_exact(),
-                  (ptr == Constant ? const_oop() : NULL), offset);
+                  (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+    }
     case NotNull:
     case BotPTR:
       return TypeOopPtr::make(ptr, offset);
@@ -2811,10 +2801,13 @@
     switch (tp->ptr()) {
     case Null:
       if( ptr == Null ) return TypePtr::make( AnyPtr, ptr, offset );
+      // else fall through to AnyNull
     case TopPTR:
-    case AnyNull:
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
       return make( ptr, klass(), klass_is_exact(),
-                   (ptr == Constant ? const_oop() : NULL), offset );
+                   (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+    }
     case NotNull:
     case BotPTR:
       return TypePtr::make( AnyPtr, ptr, offset );
@@ -2843,7 +2836,7 @@
     const TypeInstPtr *tinst = t->is_instptr();
     int off = meet_offset( tinst->offset() );
     PTR ptr = meet_ptr( tinst->ptr() );
-    int instance_id = meet_instance(tinst->instance_id());
+    int instance_id = meet_instance_id(tinst->instance_id());
 
     // Check for easy case; klasses are equal (and perhaps not loaded!)
     // If we have constants, then we created oops so classes are loaded
@@ -2912,7 +2905,7 @@
         // Find out which constant.
         o = (this_klass == klass()) ? const_oop() : tinst->const_oop();
       }
-      return make( ptr, k, xk, o, off );
+      return make( ptr, k, xk, o, off, instance_id );
     }
 
     // Either oop vs oop or interface vs interface or interface vs Object
@@ -2999,7 +2992,7 @@
 
     // Now we find the LCA of Java classes
     ciKlass* k = this_klass->least_common_ancestor(tinst_klass);
-    return make( ptr, k, false, NULL, off );
+    return make( ptr, k, false, NULL, off, instance_id );
   } // End of case InstPtr
 
   case KlassPtr:
@@ -3026,7 +3019,7 @@
 // Dual: do NOT dual on klasses.  This means I do NOT understand the Java
 // inheritence mechanism.
 const Type *TypeInstPtr::xdual() const {
-  return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance()  );
+  return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id()  );
 }
 
 //------------------------------eq---------------------------------------------
@@ -3078,7 +3071,9 @@
   }
 
   st->print(" *");
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -3106,7 +3101,7 @@
   assert(!(k == NULL && ary->_elem->isa_int()),
          "integral arrays must be pre-equipped with a class");
   if (!xk)  xk = ary->ary_must_be_exact();
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = (ptr == Constant);
   return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id))->hashcons();
@@ -3118,7 +3113,7 @@
          "integral arrays must be pre-equipped with a class");
   assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" );
   if (!xk)  xk = (o != NULL) || ary->ary_must_be_exact();
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = (ptr == Constant);
   return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id))->hashcons();
@@ -3127,7 +3122,7 @@
 //------------------------------cast_to_ptr_type-------------------------------
 const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const {
   if( ptr == _ptr ) return this;
-  return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset);
+  return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id);
 }
 
 
@@ -3140,13 +3135,13 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeAryPtr::cast_to_instance(int instance_id) const {
-  if( instance_id == _instance_id) return this;
-  bool exact = true;
-  PTR  ptr_t = NotNull;
-  if (instance_id == UNKNOWN_INSTANCE) {
-    exact = _klass_is_exact;
-    ptr_t = _ptr;
+const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const {
+  if( instance_id == _instance_id ) return this;
+  bool exact = _klass_is_exact;
+  PTR  ptr_t = _ptr;
+  if ( instance_id > 0 ) { // instances are always exactly typed
+    if (UseExactTypes) exact = true;
+    ptr_t = NotNull;
   }
   return make(ptr_t, const_oop(), _ary, klass(), exact, _offset, instance_id);
 }
@@ -3199,7 +3194,7 @@
     new_size = TypeInt::ZERO; // intermediate dead fast-path goo
   if (new_size == size())  return this;
   const TypeAry* new_ary = TypeAry::make(elem(), new_size);
-  return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset);
+  return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id);
 }
 
 
@@ -3251,8 +3246,11 @@
     PTR ptr = meet_ptr(tp->ptr());
     switch (tp->ptr()) {
     case TopPTR:
-    case AnyNull:
-      return make(ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset);
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
+      return make(ptr, (ptr == Constant ? const_oop() : NULL),
+                  _ary, _klass, _klass_is_exact, offset, instance_id);
+    }
     case BotPTR:
     case NotNull:
       return TypeOopPtr::make(ptr, offset);
@@ -3273,8 +3271,12 @@
       return TypePtr::make(AnyPtr, ptr, offset);
     case Null:
       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset);
-    case AnyNull:
-      return make( ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset );
+      // else fall through to AnyNull
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
+      return make( ptr, (ptr == Constant ? const_oop() : NULL),
+                  _ary, _klass, _klass_is_exact, offset, instance_id);
+    }
     default: ShouldNotReachHere();
     }
   }
@@ -3286,7 +3288,7 @@
     int off = meet_offset(tap->offset());
     const TypeAry *tary = _ary->meet(tap->_ary)->is_ary();
     PTR ptr = meet_ptr(tap->ptr());
-    int iid = meet_instance(tap->instance_id());
+    int instance_id = meet_instance_id(tap->instance_id());
     ciKlass* lazy_klass = NULL;
     if (tary->_elem->isa_int()) {
       // Integral array element types have irrelevant lattice relations.
@@ -3307,7 +3309,7 @@
     case TopPTR:
       // Compute new klass on demand, do not use tap->_klass
       xk = (tap->_klass_is_exact | this->_klass_is_exact);
-      return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid );
+      return make( ptr, const_oop(), tary, lazy_klass, xk, off, instance_id );
     case Constant: {
       ciObject* o = const_oop();
       if( _ptr == Constant ) {
@@ -3319,7 +3321,7 @@
         o = tap->const_oop();
       }
       xk = true;
-      return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid );
+      return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id );
     }
     case NotNull:
     case BotPTR:
@@ -3330,7 +3332,7 @@
             xk = this->_klass_is_exact;
       else  xk = (tap->_klass_is_exact & this->_klass_is_exact) &&
               (klass() == tap->klass()); // Only precise for identical arrays
-      return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, iid );
+      return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, instance_id );
     default: ShouldNotReachHere();
     }
   }
@@ -3340,16 +3342,17 @@
     const TypeInstPtr *tp = t->is_instptr();
     int offset = meet_offset(tp->offset());
     PTR ptr = meet_ptr(tp->ptr());
-    int iid = meet_instance(tp->instance_id());
+    int instance_id = meet_instance_id(tp->instance_id());
     switch (ptr) {
     case TopPTR:
     case AnyNull:                // Fall 'down' to dual of object klass
       if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
-        return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+        return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
       } else {
         // cannot subclass, so the meet has to fall badly below the centerline
         ptr = NotNull;
-        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+        instance_id = InstanceBot;
+        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
       }
     case Constant:
     case NotNull:
@@ -3360,14 +3363,15 @@
         // then we can subclass in the Java class heirarchy.
         if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
           // that is, my array type is a subtype of 'tp' klass
-          return make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+          return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
         }
       }
       // The other case cannot happen, since t cannot be a subtype of an array.
       // The meet falls down to Object class below centerline.
       if( ptr == Constant )
          ptr = NotNull;
-      return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+      instance_id = InstanceBot;
+      return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
     default: typerr(t);
     }
   }
@@ -3382,7 +3386,7 @@
 //------------------------------xdual------------------------------------------
 // Dual: compute field-by-field dual
 const Type *TypeAryPtr::xdual() const {
-  return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance() );
+  return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id() );
 }
 
 //------------------------------dump2------------------------------------------
@@ -3419,7 +3423,9 @@
     }
   }
   st->print(" *");
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -3494,7 +3500,7 @@
     return this;
 
   case NarrowOop: {
-    const Type* result = _ooptype->xmeet(t->is_narrowoop()->make_oopptr());
+    const Type* result = _ooptype->xmeet(t->make_ptr());
     if (result->isa_ptr()) {
       return TypeNarrowOop::make(result->is_ptr());
     }
@@ -3604,7 +3610,7 @@
   const TypeAryPtr *tary;
   const Type* el = elem();
   if (el->isa_narrowoop()) {
-    el = el->is_narrowoop()->make_oopptr();
+    el = el->make_ptr();
   }
 
   // Get element klass
diff --git a/hotspot/src/share/vm/opto/type.hpp b/hotspot/src/share/vm/opto/type.hpp
index df953f7..7dbcf09 100644
--- a/hotspot/src/share/vm/opto/type.hpp
+++ b/hotspot/src/share/vm/opto/type.hpp
@@ -225,6 +225,12 @@
   virtual bool      is_finite() const;           // Has a finite value
   virtual bool      is_nan()    const;           // Is not a number (NaN)
 
+  // Returns this ptr type or the equivalent ptr type for this compressed pointer.
+  const TypePtr* make_ptr() const;
+  // Returns this compressed pointer or the equivalent compressed version
+  // of this pointer type.
+  const TypeNarrowOop* make_narrowoop() const;
+
   // Special test for register pressure heuristic
   bool is_floatingpoint() const;        // True if Float or Double base type
 
@@ -648,7 +654,8 @@
   virtual int  hash() const;             // Type specific hashing
   virtual bool singleton(void) const;    // TRUE if type is a singleton
   enum {
-   UNKNOWN_INSTANCE = 0
+   InstanceTop = -1,   // undefined instance
+   InstanceBot = 0     // any possible instance
   };
 protected:
 
@@ -661,14 +668,15 @@
   bool          _klass_is_exact;
   bool          _is_ptr_to_narrowoop;
 
-  int           _instance_id;  // if not UNKNOWN_INSTANCE, indicates that this is a particular instance
-                               // of this type which is distinct.  This is the  the node index of the
-                               // node creating this instance
+  // If not InstanceTop or InstanceBot, indicates that this is
+  // a particular instance of this type which is distinct.
+  // This is the the node index of the allocation node creating this instance.
+  int           _instance_id;
 
   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
 
-  int dual_instance()      const { return -_instance_id; }
-  int meet_instance(int uid) const;
+  int dual_instance_id() const;
+  int meet_instance_id(int uid) const;
 
 public:
   // Creates a type given a klass. Correctly handles multi-dimensional arrays
@@ -701,9 +709,9 @@
   // compressed oop references.
   bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
 
-  bool is_instance()       const { return _instance_id != UNKNOWN_INSTANCE; }
-  uint instance_id()       const { return _instance_id; }
-  bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
+  bool is_known_instance()       const { return _instance_id > 0; }
+  int  instance_id()             const { return _instance_id; }
+  bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
 
   virtual intptr_t get_con() const;
 
@@ -711,16 +719,13 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   // corresponding pointer to klass, for a given instance
   const TypeKlassPtr* as_klass_type() const;
 
   virtual const TypePtr *add_offset( int offset ) const;
 
-  // returns the equivalent compressed version of this pointer type
-  virtual const TypeNarrowOop* make_narrowoop() const;
-
   virtual const Type *xmeet( const Type *t ) const;
   virtual const Type *xdual() const;    // Compute dual right now.
 
@@ -775,7 +780,7 @@
   }
 
   // Make a pointer to an oop.
-  static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = 0 );
+  static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot );
 
   // If this is a java.lang.Class constant, return the type for it or NULL.
   // Pass to Type::get_const_type to turn it to a type, which will usually
@@ -786,7 +791,7 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   virtual const TypePtr *add_offset( int offset ) const;
 
@@ -820,9 +825,9 @@
   const Type*    elem() const { return _ary->_elem; }
   const TypeInt* size() const { return _ary->_size; }
 
-  static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+  static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
   // Constant pointer to array
-  static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+  static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
 
   // Convenience
   static const TypeAryPtr *make(ciObject* o);
@@ -832,7 +837,7 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
 
@@ -911,7 +916,7 @@
 // between the normal and the compressed form.
 class TypeNarrowOop : public Type {
 protected:
-  const TypePtr* _ooptype;
+  const TypePtr* _ooptype; // Could be TypePtr::NULL_PTR
 
   TypeNarrowOop( const TypePtr* ooptype): Type(NarrowOop),
     _ooptype(ooptype) {
@@ -940,8 +945,8 @@
     return make(TypeOopPtr::make_from_constant(con));
   }
 
-  // returns the equivalent oopptr type for this compressed pointer
-  virtual const TypePtr *make_oopptr() const {
+  // returns the equivalent ptr type for this compressed pointer
+  const TypePtr *make_oopptr() const {
     return _ooptype;
   }
 
@@ -1128,6 +1133,16 @@
   return (TypeKlassPtr*)this;
 }
 
+inline const TypePtr* Type::make_ptr() const {
+  return (_base == NarrowOop) ? is_narrowoop()->make_oopptr() :
+                                (isa_ptr() ? is_ptr() : NULL);
+}
+
+inline const TypeNarrowOop* Type::make_narrowoop() const {
+  return (_base == NarrowOop) ? is_narrowoop() :
+                                (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
+}
+
 inline bool Type::is_floatingpoint() const {
   if( (_base == FloatCon)  || (_base == FloatBot) ||
       (_base == DoubleCon) || (_base == DoubleBot) )
diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp
index 9952edd..8d75b76 100644
--- a/hotspot/src/share/vm/prims/jni.cpp
+++ b/hotspot/src/share/vm/prims/jni.cpp
@@ -631,7 +631,7 @@
   DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
   tty->print_cr("FATAL ERROR in native method: %s", msg);
   thread->print_stack();
-  os::abort(false); // Prevent core dump, causes a jck failure.
+  os::abort(); // Dump core and abort
 JNI_END
 
 
diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp
index 0aa7f02..75becdf 100644
--- a/hotspot/src/share/vm/prims/jvm.cpp
+++ b/hotspot/src/share/vm/prims/jvm.cpp
@@ -624,6 +624,30 @@
   if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
 JVM_END
 
+// Rationale behind JVM_FindClassFromBootLoader
+// a> JVM_FindClassFromClassLoader was never exported in the export tables.
+// b> because of (a) java.dll has a direct dependecy on the  unexported
+//    private symbol "_JVM_FindClassFromClassLoader@20".
+// c> the launcher cannot use the private symbol as it dynamically opens
+//    the entry point, so if something changes, the launcher will fail
+//    unexpectedly at runtime, it is safest for the launcher to dlopen a
+//    stable exported interface.
+// d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
+//    signature to change from _JVM_FindClassFromClassLoader@20 to
+//    JVM_FindClassFromClassLoader and will not be backward compatible
+//    with older JDKs.
+// Thus a public/stable exported entry point is the right solution,
+// public here means public in linker semantics, and is exported only
+// to the JDK, and is not intended to be a public API.
+
+JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
+                                              const char* name,
+                                              jboolean throwError))
+  JVMWrapper3("JVM_FindClassFromBootLoader %s throw %s", name,
+              throwError ? "error" : "exception");
+  return JVM_FindClassFromClassLoader(env, name, JNI_FALSE,
+                                      (jobject)NULL, throwError);
+JVM_END
 
 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
                                                jboolean init, jobject loader,
diff --git a/hotspot/src/share/vm/prims/jvm.h b/hotspot/src/share/vm/prims/jvm.h
index b48ff19..131e0dd 100644
--- a/hotspot/src/share/vm/prims/jvm.h
+++ b/hotspot/src/share/vm/prims/jvm.h
@@ -390,6 +390,17 @@
                              jobject loader, jboolean throwError);
 
 /*
+ * Find a class from a boot class loader. Throw ClassNotFoundException
+ * or NoClassDefFoundError depending on the value of the last
+ * argument. This is the same as FindClassFromClassLoader but provided
+ * as a convenience method exported correctly on all platforms for
+ * JSR 277 launcher class loading.
+ */
+JNIEXPORT jclass JNICALL
+JVM_FindClassFromBootLoader(JNIEnv *env, const char *name,
+                            jboolean throwError);
+
+/*
  * Find a class from a given class.
  */
 JNIEXPORT jclass JNICALL
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index dec5c48..8d79795 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -946,6 +946,9 @@
   diagnostic(bool, UseIncDec, true,                                         \
           "Use INC, DEC instructions on x86")                               \
                                                                             \
+  product(bool, UseNewLongLShift, false,                                    \
+          "Use optimized bitwise shift left")                               \
+                                                                            \
   product(bool, UseStoreImmI16, true,                                       \
           "Use store immediate 16-bits value instruction on x86")           \
                                                                             \
diff --git a/hotspot/src/share/vm/runtime/hpi.hpp b/hotspot/src/share/vm/runtime/hpi.hpp
index 00fc21c..1e05ca7 100644
--- a/hotspot/src/share/vm/runtime/hpi.hpp
+++ b/hotspot/src/share/vm/runtime/hpi.hpp
@@ -66,6 +66,8 @@
   static inline int    socket_shutdown(int fd, int howto);
   static inline int    recv(int fd, char *buf, int nBytes, int flags);
   static inline int    send(int fd, char *buf, int nBytes, int flags);
+  // Variant of send that doesn't support interruptible I/O
+  static inline int    raw_send(int fd, char *buf, int nBytes, int flags);
   static inline int    timeout(int fd, long timeout);
   static inline int    listen(int fd, int count);
   static inline int    connect(int fd, struct sockaddr *him, int len);
diff --git a/hotspot/src/share/vm/runtime/java.cpp b/hotspot/src/share/vm/runtime/java.cpp
index 6f06bd0..4e0ba39 100644
--- a/hotspot/src/share/vm/runtime/java.cpp
+++ b/hotspot/src/share/vm/runtime/java.cpp
@@ -502,9 +502,9 @@
   os::shutdown();
 }
 
-void vm_abort() {
+void vm_abort(bool dump_core) {
   vm_perform_shutdown_actions();
-  os::abort(PRODUCT_ONLY(false));
+  os::abort(dump_core);
   ShouldNotReachHere();
 }
 
@@ -538,18 +538,24 @@
   java_lang_Throwable::print_stack_trace(exception(), tty);
   tty->cr();
   vm_notify_during_shutdown(NULL, NULL);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_exit_during_initialization(symbolHandle ex, const char* message) {
   ResourceMark rm;
   vm_notify_during_shutdown(ex->as_C_string(), message);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_exit_during_initialization(const char* error, const char* message) {
   vm_notify_during_shutdown(error, message);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_shutdown_during_initialization(const char* error, const char* message) {
diff --git a/hotspot/src/share/vm/runtime/java.hpp b/hotspot/src/share/vm/runtime/java.hpp
index ee6c93e..160c62b 100644
--- a/hotspot/src/share/vm/runtime/java.hpp
+++ b/hotspot/src/share/vm/runtime/java.hpp
@@ -37,7 +37,7 @@
 // Shutdown the VM but do not exit the process
 extern void vm_shutdown();
 // Shutdown the VM and abort the process
-extern void vm_abort();
+extern void vm_abort(bool dump_core=true);
 
 // Trigger any necessary notification of the VM being shutdown
 extern void notify_vm_shutdown();
diff --git a/hotspot/src/share/vm/utilities/debug.cpp b/hotspot/src/share/vm/utilities/debug.cpp
index 8fb3d9b..e395102 100644
--- a/hotspot/src/share/vm/utilities/debug.cpp
+++ b/hotspot/src/share/vm/utilities/debug.cpp
@@ -208,7 +208,9 @@
     Thread* thread = ThreadLocalStorage::get_thread_slow();
     VMError(thread, size, message, file_name, line_no).report_and_die();
   }
-  vm_abort();
+
+  // Dump core and abort
+  vm_abort(true);
 }
 
 void report_vm_out_of_memory_vararg(const char* file_name, int line_no, size_t size, const char* format, ...) {
diff --git a/hotspot/src/share/vm/utilities/ostream.cpp b/hotspot/src/share/vm/utilities/ostream.cpp
index 9b3d620..6839c78 100644
--- a/hotspot/src/share/vm/utilities/ostream.cpp
+++ b/hotspot/src/share/vm/utilities/ostream.cpp
@@ -753,21 +753,28 @@
   write(str, len);
 }
 
-bufferedStream::bufferedStream(size_t initial_size) : outputStream() {
+bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
   buffer_length = initial_size;
   buffer        = NEW_C_HEAP_ARRAY(char, buffer_length);
   buffer_pos    = 0;
   buffer_fixed  = false;
+  buffer_max    = bufmax;
 }
 
-bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() {
+bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() {
   buffer_length = fixed_buffer_size;
   buffer        = fixed_buffer;
   buffer_pos    = 0;
   buffer_fixed  = true;
+  buffer_max    = bufmax;
 }
 
 void bufferedStream::write(const char* s, size_t len) {
+
+  if(buffer_pos + len > buffer_max) {
+    flush();
+  }
+
   size_t end = buffer_pos + len;
   if (end >= buffer_length) {
     if (buffer_fixed) {
@@ -811,7 +818,7 @@
 #endif
 
 // Network access
-networkStream::networkStream() {
+networkStream::networkStream() : bufferedStream(1024*10, 1024*10) {
 
   _socket = -1;
 
@@ -831,7 +838,9 @@
 
 void networkStream::flush() {
   if (size() != 0) {
-    hpi::send(_socket, (char *)base(), (int)size(), 0);
+    int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0);
+    assert(result != -1, "connection error");
+    assert(result == (int)size(), "didn't send enough data");
   }
   reset();
 }
diff --git a/hotspot/src/share/vm/utilities/ostream.hpp b/hotspot/src/share/vm/utilities/ostream.hpp
index 5b75a7a..b69fac5 100644
--- a/hotspot/src/share/vm/utilities/ostream.hpp
+++ b/hotspot/src/share/vm/utilities/ostream.hpp
@@ -206,11 +206,12 @@
  protected:
   char*  buffer;
   size_t buffer_pos;
+  size_t buffer_max;
   size_t buffer_length;
   bool   buffer_fixed;
  public:
-  bufferedStream(size_t initial_bufsize = 256);
-  bufferedStream(char* fixed_buffer, size_t fixed_buffer_size);
+  bufferedStream(size_t initial_bufsize = 256, size_t bufmax = 1024*1024*10);
+  bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax = 1024*1024*10);
   ~bufferedStream();
   virtual void write(const char* c, size_t len);
   size_t      size() { return buffer_pos; }
diff --git a/hotspot/src/share/vm/utilities/xmlstream.cpp b/hotspot/src/share/vm/utilities/xmlstream.cpp
index b7098c8..3f03a44 100644
--- a/hotspot/src/share/vm/utilities/xmlstream.cpp
+++ b/hotspot/src/share/vm/utilities/xmlstream.cpp
@@ -59,6 +59,7 @@
   if (!is_open())  return;
 
   out()->write(s, len);
+  update_position(s, len);
 }
 
 
diff --git a/hotspot/test/compiler/6714694/Tester.java b/hotspot/test/compiler/6714694/Tester.java
new file mode 100644
index 0000000..1431c41
--- /dev/null
+++ b/hotspot/test/compiler/6714694/Tester.java
@@ -0,0 +1,820 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6714694
+ * @summary assertion in 64bit server vm (store->find_edge(load) != -1,"missing precedence edge") with COOPs
+ * @run main/othervm -Xcomp Tester
+ */
+
+/* Complexity upper bound: 38602 ops */
+
+interface Tester_Interface_0 {
+}
+
+
+abstract class Tester_Class_1 implements Tester_Interface_0 {
+    static int var_1 = (false ? (short)'b' : (short)-2.4256387E38F) | (byte)('g' * -7.660532860983624E307);
+    float var_2;
+    byte var_3;
+    static boolean var_4 = true;
+    double var_5 = 8.818325751338691E307;
+    Object var_6;
+    static short var_7;
+    final static char var_8 = 'x';
+    final static float var_9 = 2.2030989E38F;
+
+
+    public Tester_Class_1()
+    {
+        var_6 = (var_6 = (var_6 = "xkx"));
+        switch (var_7 = (var_3 = (byte)var_5))
+        {
+            case 113:
+
+            case 114:
+                Object var_12;
+                var_4 = 4.9121917E37F < 1957795258;
+                var_4 |= (var_4 ^= !var_4) ^ (var_4 |= var_4);
+                var_3 = (var_3 = (var_3 = (byte)+6010964363045275648L));
+                break;
+
+            case 102:
+
+        }
+        final float var_13 = 1.2443151E38F;
+        var_3 = (byte)(var_1 |= (var_7 = (var_3 = (byte)var_5)));
+        var_2 = (long)(var_7 = (var_3 = (byte)var_8)) - (var_7 = (byte)386742565);
+        var_4 &= var_4;
+        var_2 = (long)((var_3 = (var_3 = (byte)var_8)) / ((var_4 ^= (var_5 /= var_9) <= (var_1 &= var_1)) ? (var_7 = (short)6872886933545336832L) : (byte)var_8));
+        var_6 = "uqflj";
+        {
+            switch (((new String[var_3 = (byte)var_5])[var_3 = (byte)8097442298927900672L]).charAt(1540148550))
+            {
+                case 'l':
+
+            }
+            var_2 = (var_7 = (byte)2.9859440663042714E307);
+            {
+                Object var_14;
+            }
+            var_3 = (var_3 = (var_3 = (byte)3.3634427195550136E307));
+            var_5 += '_';
+        }
+        var_6 = "tempfdjen";
+        var_3 = (((var_4 ^= new String("jmwiwmk").endsWith("rtlstmnuo")) ? !true : !false) ? true : (var_4 = false)) ? (var_3 = (byte)var_5) : (var_3 = (var_3 = (byte)var_5));
+        var_4 ^= false;
+        if (1.6435436003809043E307 != var_9)
+        {
+            boolean var_15 = true;
+        }
+        else
+        {
+            var_4 = false;
+        }
+        {
+            Object var_16 = ((new Tester_Class_1[(byte)71832757][(byte)1.0694914E38F])[(byte)1315653071][(byte)(var_7 = (var_7 = (byte)var_8))]).var_6 = new int[(byte)var_8][var_3 = (byte)1933656747];
+        }
+        var_7 = (var_4 = var_4) ? (short)2.756967E37F : (short)'K';
+        byte var_17;
+    }
+
+
+
+    abstract public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1);
+
+
+    final double func_0(final float arg_0, final short arg_1, final boolean arg_2)
+    {
+        var_6 = (var_6 = "lmshbl");
+        var_3 = (var_3 = (new byte[(new byte[(byte)arg_1])[var_3 = (byte)arg_0]])[var_3 = (var_3 = (byte)(var_1 >>>= var_1))]);
+        var_5 %= (var_3 = (byte)1909375874);
+        var_1 /= (char)(short)'i';
+        {
+            "vgar".length();
+        }
+        int var_10;
+        {
+            var_3 = (var_4 &= true) ? (byte)(var_5 *= 6375499657746206720L) : (byte)+ (var_5 /= var_9);
+            var_7 = (var_4 = true) ? (byte)(false ? (short)749593632 : (byte)8.692758043260743E307) : (byte)var_1;
+            ((new Tester_Class_1[(byte)1.2890904018345944E308])[(byte)var_1]).var_3 = (var_3 = (byte)arg_0);
+            var_4 = true ^ var_4;
+        }
+        {
+            var_1 ^= (var_3 = (var_3 = (var_3 = (byte)'U')));
+        }
+        var_3 = (var_3 = (var_3 = (var_3 = (byte)arg_1)));
+        char var_11;
+        var_1 += (var_2 = (var_7 = arg_1));
+        {
+            var_7 = (var_7 = arg_1);
+        }
+        var_7 = arg_1;
+        var_6 = (new char[(byte)1985094111797788672L][var_3 = (byte)3112604683090268160L])[var_3 = (byte)~ (var_3 = (byte)(var_5 += var_1))];
+        var_3 = (var_3 = (var_3 = (var_3 = (byte)3694858000202921984L)));
+        var_1 /= ~ ((byte)1311538336);
+        (((var_4 |= arg_2 ? !true && arg_2 : false) ? arg_2 : arg_2) ? "iih".substring(~ (var_3 = (byte)3.5401308E37F), 'g' * arg_1) : "gynskmvoj").trim();
+        var_3 = (var_3 = arg_2 ? (byte)+ ~5247392660383928320L : (byte)8392160279007184896L);
+        var_3 = (var_3 = (var_3 = (byte)var_8));
+        return (var_5 += 7.157559E37F) + (var_11 = 'V');
+    }
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_1.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_1.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_1.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_1.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_1.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_1.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_1.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_1.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_1.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+class Tester_Class_2 extends Tester_Class_1 implements Tester_Interface_0 {
+    final static String var_18 = false | Tester_Class_1.var_4 | (Tester_Class_1.var_4 &= (Tester_Class_1.var_4 |= (Tester_Class_1.var_4 = var_4))) ? "tbobyhqne" : "";
+    static String var_19 = "acxfj";
+
+
+    public Tester_Class_2()
+    {
+        Tester_Class_1.var_4 = !Tester_Class_1.var_4;
+        var_1++;
+        var_2 = (byte)2.4009747E38F;
+        new String();
+        var_6 = (var_19 = "hsshyw");
+        var_19 = var_19;
+    }
+
+
+    public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1)
+    {
+        var_5 = 4.0352057E37F;
+        (((false && ! ((Tester_Class_1.var_4 |= !true) ^ (Tester_Class_1.var_4 ^ false))) ^ (var_4 &= true) ? var_4 : (var_4 ^= true)) ? "spskwj" : "xcqianm").length();
+        ((var_4 |= (Tester_Class_1.var_4 ^= Tester_Class_1.var_4) ? (Tester_Class_1.var_4 &= false) : (Tester_Class_1.var_4 |= Tester_Class_1.var_4)) ? (Tester_Class_1)(var_6 = new double[(byte)6.628342687109622E307]) : (Tester_Class_1)arg_1).var_6 = arg_0;
+        var_7 = (short)(byte)(short)8775325134193811456L;
+        var_4 ^= (var_4 &= !false);
+        ((Tester_Class_1)arg_1).var_3 = (var_3 = (byte)(var_5 %= 8.933448E37F));
+        Tester_Class_1 var_20 = Tester_Class_1.var_4 ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1;
+        {
+            var_19.endsWith(var_19);
+            var_6 = var_20;
+            (var_20 = (var_20 = var_20)).var_2 = (short)('p' <= 1986176769 % (int)2242661265280256000L % 2664882044098145280L ? ~ (var_3 = (byte)1.1892553447967157E308) & ~1806805036550279168L : (var_7 = (byte)var_8));
+        }
+        final boolean var_21 = Tester_Class_1.var_4;
+        var_20.var_3 = (var_3 = (var_20.var_3 = (byte)'t'));
+        boolean var_22 = true;
+        Tester_Class_1.var_4 |= (var_4 = var_21);
+        var_19 = "ocn";
+        var_19 = var_19;
+        var_1 *= Tester_Class_1.var_8;
+        var_20 = var_22 ? var_20 : var_20;
+        var_7 = var_21 ? (byte)+ ((byte)var_1) : ((var_20 = (var_20 = var_20)).var_3 = (var_3 = (var_3 = (byte)'L')));
+        return true ? (var_20 = var_20) : (new Tester_Interface_0[(byte)5618282952859970560L])[var_3 = (byte)Tester_Class_1.var_8];
+    }
+
+
+    public boolean equals(Object obj)
+    {
+        Tester_Class_1.var_7 = (var_7 = (((Tester_Class_1)obj).var_3 = (byte)var_9));
+        {
+            final Tester_Class_1 var_23 = (Tester_Class_1)obj;
+        }
+        ++Tester_Class_1.var_1;
+        var_5 = (Tester_Class_1.var_7 = var_4 ? (Tester_Class_1.var_7 = (((Tester_Class_1)obj).var_3 = (byte)Tester_Class_1.var_8)) : (var_7 = (byte)var_9));
+        ((Tester_Class_1)obj).var_6 = var_18.replace(Tester_Class_1.var_8, Tester_Class_1.var_8);
+        ((new Tester_Class_1[((Tester_Class_1)(obj = new char[var_3 = (byte)Tester_Class_1.var_8])).var_3 = (((Tester_Class_1)obj).var_3 = (byte)(var_1 %= 787509251458841600L))])[(new byte[var_3 = (byte)Tester_Class_1.var_1])[((Tester_Class_1)obj).var_3 = (byte)1.2382548E38F]]).var_3 = (((Tester_Class_1)obj).var_3 = var_4 ? (byte)Tester_Class_1.var_8 : (byte)4.1085164E36F);
+        var_1 &= var_8;
+        var_7 = var_4 ? (var_3 = (byte)var_8) : (byte)var_5;
+        var_19 = var_18;
+        ("o".compareTo("kwlfk") > (var_2 = 5289241662482067456L) ? (Tester_Class_1)obj : (Tester_Class_1)obj).var_5 -= (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (byte)var_9)));
+        return true;
+    }
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_2.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_2.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_2.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_2.var_18 = "; result += Tester.Printer.print(var_18);
+        result += "\n";
+        result += "Tester_Class_2.var_19 = "; result += Tester.Printer.print(var_19);
+        result += "\n";
+        result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_2.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_2.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_2.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_2.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_2.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+class Tester_Class_3 extends Tester_Class_2 implements Tester_Interface_0 {
+    long var_24 = 9026266006808413184L;
+    char var_25;
+    String var_26 = ((var_4 ^= Tester_Class_1.var_4) ? (!true ? false : (var_4 |= true)) : (Tester_Class_2.var_4 ^= var_4)) ? "dkmhvhl" : (var_19 = (Tester_Class_2.var_19 = (Tester_Class_2.var_19 = var_18)));
+    static Tester_Class_2 var_27;
+    short var_28 = Tester_Class_2.var_7 = (short)(Tester_Class_2.var_1 &= (var_3 = (var_3 = (var_3 = (byte)Tester_Class_2.var_9))));
+    static boolean var_29 = false;
+    static Object[][] var_30;
+    int var_31 = 750583762;
+    Tester_Class_2 var_32;
+    final static long var_33 = 3050784555932008448L;
+
+
+    public Tester_Class_3()
+    {
+        byte[] var_34;
+        var_4 &= (Tester_Class_1.var_4 = true);
+        Tester_Class_1.var_1--;
+        switch (var_28 >>= ~ ((byte)var_28))
+        {
+            case 9:
+
+            case 26:
+                Tester_Class_1.var_4 ^= Tester_Class_1.var_4;
+                (Tester_Class_2.var_19 = "pwtic").indexOf(Tester_Class_2.var_18);
+                var_26.indexOf(var_19);
+                ((Tester_Class_1)(new Tester_Interface_0[(byte)var_5])[var_24 <= var_31 ? (byte)'^' : (byte)var_24]).var_2 = 5611775846881101824L;
+                var_29 |= (Tester_Class_2.var_4 ^= var_29);
+                Tester_Class_2 var_35;
+                var_24 <<= (var_31 >>= (var_25 = var_8));
+                break;
+
+            case 28:
+
+        }
+        new String();
+        var_5 %= (var_25 = 'n');
+        ((Tester_Class_2)(Tester_Class_1)(((Tester_Class_1)(var_6 = Tester_Class_2.var_18)).var_6 = (var_26 = ""))).var_2 = var_31;
+        --var_1;
+    }
+
+
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_3.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_3.var_25 = "; result += Tester.Printer.print(var_25);
+        result += "\n";
+        result += "Tester_Class_3.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_3.var_31 = "; result += Tester.Printer.print(var_31);
+        result += "\n";
+        result += "Tester_Class_3.var_30 = "; result += Tester.Printer.print(var_30);
+        result += "\n";
+        result += "Tester_Class_3.var_24 = "; result += Tester.Printer.print(var_24);
+        result += "\n";
+        result += "Tester_Class_3.var_33 = "; result += Tester.Printer.print(var_33);
+        result += "\n";
+        result += "Tester_Class_3.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_3.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_3.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_3.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_3.var_28 = "; result += Tester.Printer.print(var_28);
+        result += "\n";
+        result += "Tester_Class_3.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_3.var_18 = "; result += Tester.Printer.print(var_18);
+        result += "\n";
+        result += "Tester_Class_3.var_19 = "; result += Tester.Printer.print(var_19);
+        result += "\n";
+        result += "Tester_Class_3.var_26 = "; result += Tester.Printer.print(var_26);
+        result += "\n";
+        result += "Tester_Class_3.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_3.var_29 = "; result += Tester.Printer.print(var_29);
+        result += "\n";
+        result += "Tester_Class_3.var_27 = "; result += Tester.Printer.print(var_27);
+        result += "\n";
+        result += "Tester_Class_3.var_32 = "; result += Tester.Printer.print(var_32);
+        result += "\n";
+        result += "Tester_Class_3.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+public class Tester {
+    static double var_36 = 2.679028326789642E307;
+    float var_37;
+    String var_38 = Tester_Class_2.var_18;
+    static Tester_Interface_0 var_39;
+    static char var_40 = 'D';
+    Tester_Class_1 var_41;
+    static int var_42;
+    final static boolean var_43 = false;
+
+
+    final static Tester_Class_2 func_0(Tester_Class_1 arg_0, final Tester_Class_2 arg_1)
+    {
+        "ooots".replaceFirst("rdxor", ((new Tester_Class_3[arg_1.var_3 = (byte)2.7836305E38F])[arg_0.var_3 = (byte)+ + +1.4958218616334936E307]).var_26);
+        if (true)
+        {
+            arg_0 = (Tester_Class_3)arg_0;
+            ((Tester_Class_3)arg_0).var_25 = var_40;
+            final Tester_Class_2 var_44 = (Tester_Class_2)((Tester_Class_3.var_29 |= var_43) ? arg_0 : (arg_0.var_6 = Tester_Class_3.var_18));
+        }
+        else
+        {
+            var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1);
+        }
+        Tester_Class_3.var_19 = "onndgsil";
+        var_39 = arg_0;
+        return (Tester_Class_2.var_4 &= Tester_Class_2.var_4 ^ true) ? (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1) : (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1);
+    }
+
+    private final static float func_1(final short arg_0, int[][] arg_1, final long arg_2)
+    {
+        Tester_Class_2.var_1 *= arg_0;
+        double var_45 = 6.841391103184752E307;
+        long var_46;
+        Tester_Class_2.var_1--;
+        --var_40;
+        ++var_40;
+        ++Tester_Class_3.var_1;
+        Tester_Class_1.var_4 = false;
+        var_36 %= 'X';
+        ++Tester_Class_2.var_1;
+        Tester_Class_1.var_1++;
+        return 3.2422038E38F;
+    }
+
+    private final static char func_2(double arg_0, final byte arg_1, int arg_2)
+    {
+        --Tester_Class_3.var_1;
+        if (Tester_Class_1.var_4)
+        {
+            if (var_43)
+            {
+                Tester_Class_3.var_1++;
+            }
+            else
+            {
+                var_40 <<= 1329560515532651520L;
+            }
+            (false & Tester_Class_2.var_4 ? (new Tester_Class_1[arg_1])[arg_1] : (new Tester_Class_1[arg_1][arg_1])[arg_1][arg_1]).var_3 = arg_1;
+            Tester_Class_2.var_19 = Tester_Class_3.var_19;
+            --var_40;
+            final long var_47 = ~Tester_Class_3.var_33 << var_40--;
+            ((Tester_Class_3)(new Tester_Class_2[arg_1][arg_1])[arg_1][arg_1]).var_24 *= (var_36 *= (long)arg_1 * ~arg_1);
+            Tester_Class_2.var_19 = Tester_Class_2.var_19;
+            ++((new Tester_Class_3[arg_1])[arg_1]).var_24;
+        }
+        else
+        {
+            var_40++;
+        }
+        var_40 <<= var_40;
+        if (true)
+        {
+            ++arg_2;
+        }
+        else
+        {
+            Tester_Class_2.var_7 = arg_1;
+        }
+        boolean var_48 = true;
+        var_36 /= arg_1;
+        final short var_49 = 15276;
+        Tester_Interface_0 var_50;
+        ((Tester_Class_2.var_19 = (Tester_Class_2.var_19 = Tester_Class_2.var_19)) + "xhi").toString();
+        arg_2++;
+        return var_40;
+    }
+
+    public final static char func_4(final boolean arg_0)
+    {
+        float var_52 = 2.8063675E38F;
+        var_40--;
+        Object var_53;
+        Tester_Class_3.var_29 |= (Tester_Class_3.var_29 &= true);
+        if (!Tester_Class_1.var_4)
+        {
+            --var_40;
+        }
+        else
+        {
+            var_52 %= 2027756834;
+        }
+        int var_54 = Tester_Class_1.var_1++;
+        var_40--;
+        long var_55;
+        byte var_56 = 97;
+        var_36 *= 9.75628909363086E307 % + -1.9812653793936264E306;
+        int var_57;
+        boolean var_58 = Tester_Class_1.var_4 ^= var_43;
+        return 'J';
+    }
+
+    static float func_5(final Object arg_0, float arg_1, final Tester_Class_2 arg_2)
+    {
+        var_39 = arg_2;
+        Tester_Class_3.var_27 = arg_2;
+        arg_1 %= 1.7777554E38F;
+        var_39 = (Tester_Class_3.var_27 = arg_2);
+        Tester_Class_3 var_59;
+        {
+            var_40 -= arg_1 - ~ (((Tester_Class_3)arg_2).var_3 = (byte)1455854212);
+        }
+        Object var_60 = Tester_Class_1.var_4 ? arg_0 : new String[arg_2.var_3 = (byte)arg_1][(byte)((Tester_Class_3)arg_0).var_28];
+        Tester_Class_3.var_27 = (Tester_Class_2)(var_39 = arg_2);
+        ((Tester_Class_3.var_4 |= var_43) ? (var_59 = (var_59 = (var_59 = (Tester_Class_3)var_60))) : (var_59 = (Tester_Class_3)arg_2)).var_24 ^= Tester_Class_3.var_1;
+        return Tester_Class_1.var_9;
+    }
+
+    private static void func_6(char arg_0, final Tester_Class_3 arg_1, String arg_2, final double arg_3)
+    {
+        ((new Tester_Class_1[(byte)arg_1.var_28])[(arg_1.var_32 = arg_1).var_3 = (byte)var_40]).var_2 = Tester_Class_3.var_9;
+        double var_61;
+        (true ? (arg_1.var_32 = arg_1) : (arg_1.var_32 = (Tester_Class_3.var_27 = (arg_1.var_32 = arg_1)))).var_6 = var_43 | (Tester_Class_2.var_4 = !Tester_Class_3.var_4) ? (arg_1.var_26 = arg_2) : (Tester_Class_2.var_19 = Tester_Class_2.var_18);
+    }
+
+    private final char func_7(int arg_0)
+    {
+        Tester_Class_2.var_4 &= var_43;
+        float var_62 = Tester_Class_3.var_9;
+        --var_40;
+        int var_63 = Tester_Class_1.var_1++;
+        {
+            "nncjfoit".indexOf((new int[(byte)'\\'])[(byte)var_36]);
+            if (var_43)
+            {
+                ((new Tester_Class_3[(byte)var_40][(byte)Tester_Class_2.var_1])[(byte)5046997225818337280L][(byte)var_63]).var_24 >>>= var_40;
+            }
+            else
+            {
+                --var_40;
+            }
+            --Tester_Class_2.var_1;
+            --var_63;
+        }
+        {
+            final byte var_64 = Tester_Class_1.var_4 ? (byte)'M' : (byte)(var_62 -= + ((byte)Tester_Class_1.var_8));
+            float var_65;
+            var_62 *= ((Tester_Class_3)(new Tester_Interface_0[var_64])[var_64]).var_24++;
+            var_36 /= var_64;
+            {
+                double var_66;
+            }
+            var_40 += 3500240160155094016L;
+            ((new Tester_Class_1[var_64][var_64])[var_64][var_64]).var_3 = (byte)(Tester_Class_2.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = var_64))));
+            ++Tester_Class_3.var_1;
+        }
+        --arg_0;
+        {
+            arg_0++;
+        }
+        Tester_Class_2.var_1++;
+        var_40 &= (short)((byte)Tester_Class_2.var_8 >> (((new Tester_Class_3[(byte)var_36])[(byte)(var_40 = Tester_Class_3.var_8)]).var_3 = (byte)((byte)3.3531374E38F * var_40)));
+        var_36 %= (var_62 = (byte)900943133);
+        var_36 = Tester_Class_3.var_33;
+        var_62 += (var_40 /= (byte)6766658341842315264L % (byte)'p') * (short)2019461672;
+        --var_40;
+        if (true)
+        {
+            var_62 *= 365879806965555200L;
+        }
+        else
+        {
+            var_36 -= ~9163555887358003200L;
+        }
+        Tester_Class_1.var_4 = Tester_Class_1.var_4;
+        {
+            var_40 <<= var_63;
+        }
+        var_40++;
+        String var_67;
+        return Tester_Class_1.var_8;
+    }
+
+    private final static Tester_Interface_0 func_8(char arg_0, final Tester_Class_2 arg_1, final String arg_2)
+    {
+        ((new Tester[(byte)((Tester_Class_3)arg_1).var_28])[((Tester_Class_1)(var_39 = arg_1)).var_3 = ((Tester_Class_3.var_27 = (Tester_Class_3)arg_1).var_3 = (byte)+ -9.9100855E36F)]).var_38 = (var_43 ? "k" : Tester_Class_2.var_19).substring(350785312);
+        return (new Tester_Interface_0[(byte)'l'])[((Tester_Class_1)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1))).var_3 = ((Tester_Class_3.var_27 = arg_1).var_3 = (((Tester_Class_3)arg_1).var_3 = (arg_1.var_3 = (arg_1.var_3 = (byte)'['))))];
+    }
+
+    private final int func_9(Tester_Class_3 arg_0, char arg_1)
+    {
+        final float var_68 = Tester_Class_3.var_9;
+        Tester_Class_2.var_18.toLowerCase();
+        double var_69;
+        {
+            Tester_Class_3.var_29 ^= !false || Tester_Class_2.var_4;
+        }
+        Tester_Class_1 var_70;
+        (Tester_Class_3.var_27 = (Tester_Class_2)(var_70 = arg_0)).var_6 = (Tester_Class_2)((var_41 = arg_0).var_6 = (arg_0.var_6 = arg_0));
+        "hv".codePointBefore(--Tester_Class_2.var_1);
+        var_41 = arg_0;
+        return ~ (((arg_0 = arg_0).var_24 &= arg_1) == 3.0764282E38F ? (byte)457565863 : ((arg_0 = arg_0).var_3 = (byte)arg_0.var_28));
+    }
+
+    private static void func_10(double arg_0, final Tester_Class_3 arg_1, double arg_2)
+    {
+        arg_1.var_32 = 'g' != 1.520646515461986E307 ? (arg_1.var_32 = arg_1) : arg_1;
+        Tester_Class_2.var_19.startsWith(Tester_Class_2.var_19 = Tester_Class_3.var_18);
+        Tester_Class_1.var_4 ^= true & (arg_1.var_3 = (arg_1.var_3 = (byte)- ((byte)1.4509185661781193E308))) > (arg_1.var_2 = var_40);
+        var_36 += Tester_Class_3.var_9;
+    }
+
+    Tester_Interface_0 func_12(final Object arg_0, float arg_1)
+    {
+        switch (((Tester_Class_3)arg_0).var_3 = (byte)arg_1)
+        {
+            case 4:
+                var_41 = (Tester_Class_3)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_0)));
+                double var_72 = (double)3858573493713776640L;
+                byte var_73 = (var_41 = (Tester_Class_2)arg_0).var_3 = (((Tester_Class_3)arg_0).var_3 = (byte)var_72);
+                break;
+
+            case 13:
+                (Tester_Class_3.var_27 = (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)(Tester_Class_2)arg_0)).var_3 = (Tester_Class_2.var_1 *= ((Tester_Class_3)arg_0).var_24) == (byte)Tester_Class_3.var_33 ? (byte)188693954866039808L : (byte)Tester_Class_2.var_8;
+                break;
+
+            default:
+                var_40 <<= (byte)157510337;
+                break;
+
+            case 26:
+
+            case 122:
+
+        }
+        Tester_Interface_0 var_74;
+        long var_75;
+        var_41 = (var_41 = (var_41 = (Tester_Class_2)arg_0));
+        arg_1 *= 1601420762;
+        var_74 = (var_41 = Tester_Class_1.var_4 ? (Tester_Class_3)arg_0 : (Tester_Class_2)arg_0);
+        (Tester_Class_1.var_4 ? (Tester_Class_3)(var_39 = (Tester_Class_3)arg_0) : (true ? (Tester_Class_3)arg_0 : (Tester_Class_3)arg_0)).var_28 *= 1066935145;
+        var_40 >>>= (byte)6.643183E36F / - ((byte)1.277596E37F);
+        {
+            ((Tester_Class_3)(((Tester_Class_3)((Tester_Class_3.var_29 ^= (Tester_Class_3.var_29 &= var_43)) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0)).var_32 = (Tester_Class_3.var_27 = (Tester_Class_2)arg_0))).var_28--;
+        }
+        var_38 = "qad";
+        byte var_76 = ((Tester_Class_2)(var_39 = (Tester_Class_3)arg_0)).var_3 = true ? ((var_41 = (var_41 = (Tester_Class_3)arg_0)).var_3 = (byte)1.7128118638075888E308) : (byte)1.6562746603631249E308;
+        return var_39 = (Tester_Class_3)((var_41 = (Tester_Class_3)arg_0).var_6 = Tester_Class_2.var_18);
+    }
+
+    protected final String func_13()
+    {
+        float var_77;
+        var_38 = (Tester_Class_2.var_19 = var_38);
+        Tester_Class_2.var_4 ^= !var_43 | (Tester_Class_3.var_29 ^= Tester_Class_1.var_4);
+        Tester_Class_3.var_1--;
+        Tester_Class_2.var_1++;
+        return Tester_Class_2.var_18;
+    }
+
+    public static String execute()
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { return t.toString(); }
+            catch (Throwable e) { return "Error during result conversion to String"; }
+        } catch (Throwable e) { return "Error during test execution"; }
+    }
+
+    public static void main(String[] args)
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { System.out.println(t); }
+            catch(Throwable e) { }
+        } catch (Throwable e) { }
+    }
+
+    private void test()
+    {
+        int var_78 = 0;
+        var_39 = (new Tester_Class_1[(byte)var_40])[(byte)Tester_Class_3.var_33];
+        while (var_43 && (var_78 < 70 && true))
+        {
+            var_40 *= ~ ~Tester_Class_3.var_33 % Tester_Class_3.var_9;
+            var_78++;
+            var_39 = new Tester_Class_3();
+            var_39 = (var_41 = (Tester_Class_3.var_27 = new Tester_Class_2()));
+        }
+        final Tester_Class_3 var_79 = (Tester_Class_1.var_4 ? ~Tester_Class_3.var_33 : var_36) == 1433764895112462336L ? new Tester_Class_3() : new Tester_Class_3();
+        Tester_Class_2 var_80;
+    }
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester.var_40 = "; result += Printer.print(var_40);
+        result += "\n";
+        result += "Tester.var_42 = "; result += Printer.print(var_42);
+        result += "\n";
+        result += "Tester.var_36 = "; result += Printer.print(var_36);
+        result += "\n";
+        result += "Tester.var_37 = "; result += Printer.print(var_37);
+        result += "\n";
+        result += "Tester.var_39 = "; result += Printer.print(var_39);
+        result += "\n";
+        result += "Tester.var_38 = "; result += Printer.print(var_38);
+        result += "\n";
+        result += "Tester.var_43 = "; result += Printer.print(var_43);
+        result += "\n";
+        result += "Tester.var_41 = "; result += Printer.print(var_41);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+    static class Printer
+    {
+        public static String print(boolean arg) { return String.valueOf(arg); }
+        public static String print(byte arg)    { return String.valueOf(arg); }
+        public static String print(short arg)   { return String.valueOf(arg); }
+        public static String print(char arg)    { return String.valueOf((int)arg); }
+        public static String print(int arg)     { return String.valueOf(arg); }
+        public static String print(long arg)    { return String.valueOf(arg); }
+        public static String print(float arg)   { return String.valueOf(arg); }
+        public static String print(double arg)  { return String.valueOf(arg); }
+
+
+        public static String print(Object arg)
+        {
+            return print_r(new java.util.Stack(), arg);
+        }
+
+        private static String print_r(java.util.Stack visitedObjects, Object arg)
+        {
+            String result = "";
+            if (arg == null)
+                result += "null";
+            else
+            if (arg.getClass().isArray())
+            {
+                for (int i = 0; i < visitedObjects.size(); i++)
+                    if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+                visitedObjects.push(arg);
+
+                final String delimiter = ", ";
+                result += "[";
+
+                if (arg instanceof Object[])
+                {
+                    Object[] array = (Object[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print_r(visitedObjects, array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof boolean[])
+                {
+                    boolean[] array = (boolean[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof byte[])
+                {
+                    byte[] array = (byte[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof short[])
+                {
+                    short[] array = (short[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof char[])
+                {
+                    char[] array = (char[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof int[])
+                {
+                     int[] array = (int[]) arg;
+                     for (int i = 0; i < array.length; i++)
+                     {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                     }
+                }
+                else
+                if (arg instanceof long[])
+                {
+                    long[] array = (long[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof float[])
+                {
+                    float[] array = (float[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof double[])
+                {
+                    double[] array = (double[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+
+                result += "]";
+                visitedObjects.pop();
+
+            } else
+            {
+                result += arg.toString();
+            }
+
+            return result;
+        }
+    }
+}
+
+
diff --git a/hotspot/test/compiler/6716441/Tester.java b/hotspot/test/compiler/6716441/Tester.java
new file mode 100644
index 0000000..9e76801
--- /dev/null
+++ b/hotspot/test/compiler/6716441/Tester.java
@@ -0,0 +1,940 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6716441
+ * @summary error in meet with +DoEscapeAnalysis
+ * @run main/othervm -Xcomp -XX:+AggressiveOpts Tester
+ */
+
+/* Complexity upper bound: 70070 ops */
+
+class Tester_Class_0 {
+    Object var_1;
+
+
+    public Tester_Class_0()
+    {
+        var_1 = "cmlv";
+        {
+            final Object var_7 = false ? (var_1 = "flwnujmm") : (var_1 = "");
+        }
+        float var_8 = 0F;
+        boolean var_9;
+        do
+        {
+            ((var_9 = (var_9 = (var_9 = false))) && true ? new String("yvirc") : "rmfkjbx").indexOf(99854165);
+            var_8++;
+            boolean var_10 = true;
+            var_10 |= true ? true : false;
+            var_10 |= false | var_10 ? (var_10 |= true) : true;
+        } while (var_8 < 1 && "tpb".charAt(~ ((byte)2449669946597620736L)) >>> (byte)1.704554E38F >= ('t' < var_8 ? (short)var_8 : 1237471887 / +4199632387838836736L));
+        var_1 = (var_1 = "y");
+        switch ((var_9 = "".equalsIgnoreCase("kqalxwsnu") | false) ? (new char[(byte)1.3230508534158742E308])[(byte)(short)93390917] : 'c')
+        {
+            case 'U':
+
+            case 'W':
+
+            case 'A':
+
+            case 72:
+
+        }
+        var_9 = (var_9 = false);
+        float var_11 = 0F;
+        var_9 = true;
+        for (var_1 = (var_1 = new boolean[(new byte[(byte)'O'])[(byte)'l']]); var_11 < 2; var_1 = (true ? "" : "nn").toUpperCase())
+        {
+            var_9 = true;
+            var_11++;
+            var_9 = true;
+            int var_12 = (new short[(byte)1825213428])[(byte)1.6151095881186834E308] + (byte)(short)'V';
+        }
+        var_1 = (new boolean[(byte)1546704177][(byte)6314352927310996480L][(byte)6838913812451802112L])["e".equalsIgnoreCase("d") ? (byte)3.964472879846357E307 : (byte)'L'];
+        var_9 = (var_9 = false);
+    }
+
+
+
+    protected Object clone()
+    {
+        var_1 = (var_1 = "dbogknllu");
+        var_1 = "jljax";
+        var_1 = (var_1 = false ? "s" : "upqinst");
+        if (false)
+        {
+            var_1 = (var_1 = (var_1 = "nwhu"));
+        }
+        else
+        {
+            short var_2;
+            var_2 = false ? (byte)((short)'e' - (byte)2.267975E38F) : (byte)1.28920093132789E308;
+        }
+        (((byte)2.3450009E38F >= (byte)- (+ - -1.6256751428449317E306 * 954071273906192384L) ? true : true) ? "gpv".substring(468176669, 1915798010) : "macqbvf").offsetByCodePoints("ivwivjege".charAt(1819923298) >>> (byte)((- ~653213024937366528L + 'N') * +1.0297164E38F) + (short)~ + -4535402293751053312L, (short)3837656677199316992L + (new byte[(byte)2.1586717E38F])[(byte)((short)719847962 - 8.599263E37F)]);
+        new String((char)650047353 > (short)'I' ? "maygldu".replaceAll("hpn", "bacoyows") : "nkx").endsWith(new String("h" + "vx"));
+        byte var_3;
+        return var_1 = "vbiccvdu";
+    }
+
+    public boolean equals(Object obj)
+    {
+        var_1 = "rxpocj";
+        obj = "ndogtwvuh";
+        {
+            {
+                var_1 = "vmdkvs";
+            }
+            final boolean var_4 = false;
+            long var_5;
+            var_5 = (short)'G' >> + ((byte)1.1872624048733707E308);
+        }
+        var_1 = (new byte[(byte)(short)1.7804576633213148E308][(byte)(short)8.300151422843056E307])[(byte)3110360603258978304L];
+        obj = "fudebwroh";
+        obj = new Object[(false && false) & false ? (byte)8796624364629753856L : (byte)- +1.5843542184394165E308];
+        if (true)
+        {
+            var_1 = new float[(byte)1372189277][(byte)((byte)8.352642520619892E307 == (! !false ^ true ? (short)1.3871033E37F : (byte)'f') ? 7.33899E37F - (short)2.2558552E37F : 2.6072269E38F)];
+        }
+        else
+        {
+            var_1 = obj;
+            obj = new boolean[(byte)8.623747E37F][(byte)~ ((byte)(short)(byte)2100816354)];
+        }
+        var_1 = new int[(new byte[(byte)7410132537719084032L])[(byte)1524949007]][(byte)((long)9188640 ^ 'n')];
+        if (-3.0364305E38F > 8.114229090672013E307)
+        {
+            var_1 = (var_1 = new boolean[(byte)1.0354788699727844E308][(byte)-4867581638981979136L]);
+        }
+        else
+        {
+            obj = (obj = obj);
+            obj = (new int[(byte)'f'][(byte)7563033606293564416L])[(byte)2052737645];
+        }
+        long var_6;
+        var_6 = (+ + ~3862500564271147008L != (short)8549491352795953152L || (byte)+ + (var_6 = 'D') > (var_6 = 1687952259)) && true ? (short)1756260278 : (byte)(short)3.202384E36F;
+        return false ^ ((false ? !true : true) ? false : (true ? ! !false : false));
+    }
+
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_0.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+interface Tester_Interface_1 {
+}
+
+
+final class Tester_Class_2 extends Tester_Class_0 {
+    static char var_13;
+    final static long var_14 = ~ ~ (((false ? !true ^ !true : !false | true) ? (byte)1.4363583E38F : (byte)(short)'X') * + + +3767002589844008960L << (var_13 = (var_13 = 'X')));
+
+
+    public Tester_Class_2()
+    {
+        ((true ? (byte)- ((byte)2.6338962E38F) : (byte)'H') <= (short)8.671266E37F || !false & true ? (Tester_Class_0)(var_1 = "tgoexsr") : (Tester_Class_0)(var_1 = "mptusv")).var_1 = "tbxbgyti";
+        var_1 = true ? (var_1 = "islgpxwa") : "rypkbu";
+        var_1 = "vngiif";
+        var_13 = (var_13 = (short)~ (-3250577075350561792L + +2983539228635145216L - '`') < 861590495 * (short)1.5299644E38F ? 'V' : 'G');
+        Object[] var_27;
+        var_1 = (var_1 = "glu");
+    }
+
+
+
+
+
+    private static int func_0(Tester_Interface_1 arg_0, Tester_Interface_1 arg_1, final int arg_2)
+    {
+        var_13 = 'i';
+        new String();
+        (true ? "pu" : "oltbcysyd").substring(1236315614);
+        byte var_15;
+        var_15 = (new byte[(byte)1582653493940204544L][(byte)(char)-1.5806537192822515E308])[(byte)1.2986292E38F][(byte)(short)arg_2];
+        if (true || true)
+        {
+            ((new Tester_Class_2[var_15 = (byte)'q'])[var_15 = 7.653082E37F < (var_13 = 'o') ? (byte)- - + +3.1640875E38F : (byte)-6820511772487837696L]).var_1 = (new Tester_Class_0[(byte)(short)(new byte[(byte)1080194717])[(byte)8297829563314362368L]])[var_15 = (var_15 = (var_15 = (var_15 = (byte)'t')))];
+            double[] var_16;
+        }
+        else
+        {
+            arg_1 = (arg_1 = arg_0);
+        }
+        var_13 = (var_13 = 'o');
+        var_13 = (false || false ^ false) ^ !true ? 'Z' : (var_13 = 'i');
+        return true ? (var_15 = (byte)'C') : 1120493294;
+    }
+
+    static double func_1(final int arg_0, long arg_1, long arg_2)
+    {
+        "ghtfhmbeg".compareToIgnoreCase("djn");
+        {
+            ((true ? true : ! !true) ? "" : "ioowivxge").substring(1844979226, "ppsk".startsWith("lllmn") | false ? arg_0 * arg_0 : (byte)663320199);
+            ((Tester_Class_0)(((new Tester_Class_2[(byte)4797509007239530496L])[(byte)(- -2.8961086E38F - arg_1)]).var_1 = new float[(byte)('m' / 6.0657416E37F)])).var_1 = new boolean[(byte)(short)(+4.515459E37F - (short)arg_0)][(byte)(-1.3002677717712297E308 + (var_13 = "bcjfdnc".charAt(arg_0)) * (arg_2 - 1.6058080036165979E308))];
+            var_13 = 'E';
+        }
+        float var_17 = 0F;
+        --arg_1;
+        do
+        {
+            final String[] var_18 = new String[(byte)(short)arg_0];
+            var_17++;
+            Object var_19 = (new Object[(byte)var_17])[(false ? "xfkx".equalsIgnoreCase("j") : !false) ^ !false ? (byte)(1.6627987E35F * 2.62825E38F) : (byte)var_17];
+        } while (var_17 < 2 && false | ((byte)1.4661115E38F | arg_0 - 'l') < ('J' & (byte)+ ((float)1200013759)));
+        long var_20 = 0L;
+        arg_2--;
+        for (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'p'))))); var_20 < 4; var_13 = 'y')
+        {
+            new String((true | true ? "oxpfy" : "gaynucv") + (true ? "cmrrk".substring(653981013, arg_0) : "ociewl" + "srhbvcgci"));
+            var_20++;
+            arg_2 >>= arg_0;
+            arg_2 = false ? (byte)'l' : (byte)(~var_20 - (byte)1.1290483681734838E308);
+        }
+        ((new Tester_Class_2[(byte)arg_1++])[(byte)685259385]).var_1 = new Tester_Interface_1[(byte)arg_0];
+        --arg_1;
+        var_13 = 483446392 - (byte)'P' < ((short)(true ? (var_13 = 't') : 'n') & (short)'l') ? (var_13 = 'q') : (var_13 = (var_13 = 'h'));
+        var_13 = 'y';
+        return 1.097000731360761E308;
+    }
+
+    private final boolean func_2(final short[][] arg_0, byte arg_1, Object arg_2)
+    {
+        var_1 = new char[arg_1];
+        arg_1 /= (var_13 = 'A') + -var_14;
+        int var_21 = 0;
+        arg_2 = (new Tester_Class_0[arg_1 += var_14][arg_1])[arg_1 >>>= 'R' + + -var_14 - 4078879817303787520L];
+        for (arg_1--; (+ +1.1473423E38F < 'w' & false | var_21 != (short)4633877342445358080L | !false ? false | !false : true) && (var_21 < 1 && (arg_0[arg_1])[arg_1 %= 7.136449148111178E307] > 7.362329280963185E307); arg_1++)
+        {
+            arg_1 = (arg_1 %= + -9.872181578576624E307);
+            var_21++;
+            arg_1 /= 7.365334241099395E307;
+            var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'A')))));
+        }
+        arg_1 >>= var_14;
+        boolean var_22 = false;
+        return ((var_22 &= true) && var_22 ? (short)1.568578228250838E308 : arg_1) >= (new float[arg_1])[arg_1 /= 1.6849858816110731E308];
+    }
+
+    public final String func_3(Tester_Interface_1 arg_0)
+    {
+        arg_0 = arg_0;
+        arg_0 = (arg_0 = arg_0);
+        var_13 = (var_13 = (var_13 = (var_13 = "rqimya".charAt(390686412))));
+        ((Tester_Class_0)(var_1 = "suxd")).var_1 = new Tester_Class_0[(byte)(float)(short)1.584667675541511E308];
+        arg_0 = ((byte)+ + - +1.3636011E38F == 'L' ^ true) & (!true | true) ? (arg_0 = arg_0) : arg_0;
+        var_1 = (((Tester_Class_0)(var_1 = (Tester_Class_0)(var_1 = "ndxcurdr"))).var_1 = (var_1 = (var_1 = "schnhe")));
+        var_1 = (new Object[(byte)(var_13 = (var_13 = 'G'))])[(byte)((byte)1.5366658198344074E308 - 1.0051541518022535E308)];
+        var_13 = (var_13 = 'x');
+        (true ? (Tester_Class_0)(var_1 = "slesdph") : (Tester_Class_0)(var_1 = "wxj")).var_1 = false ? (Tester_Class_0)(var_1 = "iddvoil") : (Tester_Class_0)(var_1 = "yjbxhuip");
+        var_13 = (var_13 = 'f');
+        var_1 = (new short[(byte)1.8902424351360974E307])[(new byte[(byte)1552392028])[(byte)'V']] >= (1.2449926736063704E308 + 'K') / (short)1.0847178E38F / ((short)'M' % (1.225890077244388E308 + + ((byte)1.5358312881295287E308))) ? (Tester_Class_0)(var_1 = "khfntg".toString()) : (Tester_Class_0)(var_1 = "jkttx");
+        {
+            arg_0 = arg_0;
+        }
+        arg_0 = arg_0;
+        var_13 = (true ? "jndbffakc" : "hhcsc").charAt((byte)7322932713210745856L >> (short)(var_13 = (var_13 = 'R')));
+        var_13 = (var_13 = (var_13 = 'U'));
+        {
+            "gepdu".trim();
+        }
+        var_13 = 'H';
+        new String();
+        {
+            (false ^ (true ^ ((!true | ! !true) ^ ! (1.7800668444792402E308 * var_14 >= (var_13 = (var_13 = (var_13 = 'g')))))) ? "dsm" : "g").toUpperCase().toString();
+            ((Tester_Class_0)(var_1 = "fcdvd")).var_1 = (Tester_Class_0)(((Tester_Class_0)(var_1 = "uwhnte")).var_1 = "vpatqpd");
+        }
+        switch (((byte)((byte)((int)'n' / var_14) >>> (short)7.786475993917233E307 - (var_13 = 'm')) <= (("".endsWith("pbypgis") ^ false) & true ? (byte)func_0(arg_0, arg_0, 723551781) : (short)140766856) ? true | (!false || false) : 'F' != (var_13 = 'V')) ? (var_13 = 'j') : 'D')
+        {
+            case 'p':
+
+        }
+        var_13 = (var_13 = (var_13 = 'y'));
+        var_13 = ("" + "wwbxwyt").charAt((short)8373354379880418304L << (short)(byte)1.557224945027141E308);
+        arg_0 = true ? (arg_0 = arg_0) : arg_0;
+        ((Tester_Class_0)(((Tester_Class_0)(var_1 = "rmkvbp")).var_1 = (var_1 = "gvb"))).var_1 = new Tester_Class_0[(byte)var_14];
+        arg_0 = arg_0;
+        return 2.5245162E38F + 3.9088502076337727E307 > 1.0883030748712796E308 ? "efttufmbg" : "xy";
+    }
+
+    protected short func_4(final double arg_0, long arg_1, final Object arg_2, final byte arg_3)
+    {
+        (((("ptnmpn".startsWith("xxgxjvsie") ? !true : ! !true) ? ! !false : false) ? (true ? true : false) : (var_13 = (var_13 = 'X')) == 1948276447) ? (Tester_Class_0)(var_1 = new float[arg_3][arg_3]) : (Tester_Class_0)arg_2).var_1 = new double[(new byte[arg_3][arg_3])[arg_3][arg_3]][arg_3];
+        boolean var_23;
+        return true ? (short)'r' : (byte)(short)('\\' >>> arg_3);
+    }
+
+    final static byte func_5(final long arg_0, float arg_1, final double arg_2)
+    {
+        arg_1 = arg_2 <= ((var_13 = 'D') <= - (3463565869695079424L << 'S') ? 'a' : (var_13 = 'o')) | (true ? !false : !false) ? (byte)(short)(var_13 = 'r') : (short)(byte)'S';
+        {
+            {
+                arg_1 %= '_';
+            }
+            char var_24 = 'G';
+            "hc".lastIndexOf("");
+            arg_1 *= (arg_1 /= (byte)-8.308933840953204E306);
+            --var_24;
+            arg_1 /= ~ ((byte)2.2736606E38F) <= (3392301601783633920L == 3.015267E38F ^ ! !true ? (byte)88382550 : (byte)1.2019729E38F) ? 1027309963 : + -4.355887546298483E307;
+            ((new Tester_Class_2[(byte)arg_2])[(byte)870592870]).var_1 = "i";
+            arg_1 /= 't';
+        }
+        var_13 = 'f';
+        Tester_Class_0 var_25 = (new Tester_Class_0[(byte)arg_1])[(true | false ^ !false) & ! !true & - +2.758844E38F >= (new short[(byte)5.9160883E37F])[(byte)'r'] ? (byte)arg_0 : (byte)((short)1802078016 & arg_0)];
+        arg_1 /= (byte)arg_2;
+        var_13 = 'R';
+        boolean var_26 = (true ? false : !false) ? false : !true == ! !false;
+        arg_1 %= (var_26 ^= (byte)1101752087 <= (short)arg_1) ? arg_1 : (float)1882235314;
+        var_25 = var_25;
+        if (var_26 &= var_26)
+        {
+            var_13 = "".startsWith("vp", - ((byte)2040501187) ^ (byte)-3921263616446438400L) ? "gam".charAt(+ ((byte)arg_1)) : (var_13 = 'H');
+            arg_1 /= var_26 | ! (var_26 ^ (byte)arg_0 <= (var_13 = 'r') | (var_26 |= var_26)) ? 'N' : ~8963227563301903360L;
+        }
+        else
+        {
+            var_13 = 'l';
+            var_25 = (var_25 = var_25);
+        }
+        arg_1 += (byte)(("m".substring(837996717, 861903057).startsWith("vwpky", (var_13 = 'Z') % (byte)arg_1) ? !false ^ !var_26 : var_26) ? (byte)arg_1 : ((var_26 | var_26) ^ !false ? (short)'U' : (short)'d'));
+        ((1.3445538E38F < (arg_1 -= 1236356135) ^ (var_26 = true)) & var_26 ? var_25 : (var_25 = var_25)).var_1 = true ? (var_25.var_1 = var_25) : (var_25.var_1 = var_25);
+        var_26 |= - ((byte)251113415) < (short)arg_1 & false & false;
+        arg_1 += (var_26 &= true) ? 7.546147305340402E307 : (true & !var_26 ? (byte)1.5107802154474685E307 : (byte)arg_1);
+        var_25.var_1 = true ? "bqsewhn" : "aojssvan";
+        return (byte)(var_13 = (char)(new short[(byte)46697464])[(byte)var_14]);
+    }
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_2.var_13 = "; result += Tester.Printer.print(var_13);
+        result += "\n";
+        result += "Tester_Class_2.var_14 = "; result += Tester.Printer.print(var_14);
+        result += "\n";
+        result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+public class Tester {
+    static Tester_Class_0 var_28;
+    double var_29 = 4.861846831496217E307;
+    static byte var_30 = 79;
+    static boolean var_31 = false;
+    final byte var_32 = 48;
+
+
+    public short func_0(final byte arg_0, boolean arg_1, final double arg_2)
+    {
+        --var_30;
+        new Tester_Class_2().var_1 = "xdwldeqhc";
+        char var_33 = 'd';
+        return (var_31 = var_30 < (new short[var_30])[var_30]) ? (short)(var_33 >>>= (short)2.3152642E38F) : var_30;
+    }
+
+    private final float func_1(final long arg_0, final Tester_Class_0 arg_1, Tester_Class_0 arg_2, final char arg_3)
+    {
+        {
+            new Tester_Class_0();
+        }
+        var_30 >>= (short)1.1469118780047631E308;
+        var_31 |= var_31;
+        if (true)
+        {
+            Tester_Class_2 var_34 = (var_31 ^= (var_31 ^= false)) ? (Tester_Class_2)arg_1 : (new Tester_Class_2[var_32])[var_30];
+        }
+        else
+        {
+            "shqjwg".compareToIgnoreCase(false ? "gxoyw" + "cx" : "r" + "icj");
+        }
+        ((new Tester_Class_2[var_32])[++var_30]).var_1 = (new Object[var_30][var_32][var_32])[var_30 |= var_32];
+        arg_1.var_1 = (arg_2 = arg_2);
+        arg_1.var_1 = (((new Tester_Class_2[var_30])[var_30 = var_32]).var_1 = new String[var_32]);
+        var_28 = (Tester_Class_2)((arg_2 = arg_2).var_1 = new double[var_30]);
+        arg_2 = arg_1;
+        final boolean var_35 = "qjsdfuyru".endsWith("nuw" + "bne") | arg_3 >= 1.2054153346397785E308;
+        var_31 &= (var_31 ^= var_35);
+        {
+            var_31 &= var_31 ? false : !false;
+        }
+        if (var_31)
+        {
+            var_28 = (new Tester_Class_2[var_32])[var_32];
+        }
+        else
+        {
+            arg_1.equals((new Object[var_32])[var_32]);
+        }
+        ((var_31 ^= true) ? "x" : "euc").substring(+ (var_30 ^= var_30) & (byte)(new short[var_30])[var_30 /= 4.220757896697652E307]);
+        arg_2 = var_31 ? (Tester_Class_2)arg_1 : (Tester_Class_2)arg_2;
+        arg_2 = (Tester_Class_2)(new Object[var_32][var_32])[var_30][var_32];
+        return 9.932983E36F * (Tester_Class_2.var_13 = arg_3);
+    }
+
+    public int func_2(Tester_Class_0 arg_0)
+    {
+        "ptwusxrxn".indexOf("v");
+        var_30 |= 1770666843;
+        var_29 += (short)(Tester_Class_2.var_14 / Tester_Class_2.var_14);
+        if (var_31)
+        {
+            var_30 = var_32;
+        }
+        else
+        {
+            double var_36;
+        }
+        if (true)
+        {
+            var_30 -= 2.1474216E38F;
+        }
+        else
+        {
+            var_29 += 'f';
+        }
+        var_29 -= Tester_Class_2.var_14;
+        if (false)
+        {
+            arg_0.var_1 = arg_0;
+        }
+        else
+        {
+            arg_0 = (var_28 = (var_28 = arg_0));
+        }
+        {
+            Tester_Class_2.var_13 = 'p';
+        }
+        var_29 = ~Tester_Class_2.var_14 % 'y';
+        switch (var_30 >>>= var_30)
+        {
+            case 115:
+
+        }
+        arg_0 = arg_0;
+        var_31 ^= (var_31 = true);
+        return "".charAt(~var_32) >> ((var_31 &= true) ? var_30 : var_32);
+    }
+
+    protected double func_3(boolean[] arg_0, double arg_1, long[][] arg_2)
+    {
+        switch (var_31 ? (short)(var_32 / (arg_1 /= (int)(arg_1 *= (Tester_Class_2.var_13 = ']')))) : (var_30 ^= + +Tester_Class_2.var_14 * (+ +3075166460237931520L / '[')))
+        {
+            case 31:
+
+            case 118:
+
+        }
+        Tester_Class_2.var_13 = 'm';
+        "mwkh".indexOf("hdgiquve", (new char[var_32])[var_30 &= 'S'] % var_30);
+        final boolean var_37 = false;
+        char var_38 = 'F';
+        var_28 = (new Tester_Class_2[var_30][var_30])[var_30 *= var_38][var_32];
+        new Tester_Class_0().var_1 = new char[var_32][var_30];
+        var_30 &= var_30;
+        var_31 |= (var_31 |= true);
+        int var_39 = 1769831681;
+        final Tester_Class_2 var_40 = (var_31 |= false ? var_31 : var_37) ? (Tester_Class_2)((new Object[var_30][var_30][var_32])[var_30 <<= var_30])[var_30][var_30++] : (Tester_Class_2)new Tester_Class_0();
+        var_30 -= +var_30;
+        "dvmuim".replaceFirst("clmisuxu", "".toLowerCase() + "xi");
+        var_39 = var_38 - (short)585806817;
+        arg_1 += (double)(short)(6.4329855E37F / var_32 * (var_38 += 'w'));
+        ++var_39;
+        var_40.var_1 = (var_28 = (var_28 = var_40));
+        var_29 /= 3.5705444317400964E306;
+        Tester_Interface_1 var_41;
+        return arg_1;
+    }
+
+    final char func_4(final long arg_0, int arg_1, final int arg_2)
+    {
+        {
+            Tester_Class_2.var_13 = 'D';
+            var_31 = false;
+        }
+        if (var_31)
+        {
+            var_30--;
+            Tester_Class_0 var_42 = var_28 = (new Tester_Class_0[var_32])[var_32];
+        }
+        else
+        {
+            Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'H');
+        }
+        var_28 = (Tester_Class_2)(new Tester_Class_2().var_1 = (var_28 = (new Tester_Class_0[var_30])[var_30]));
+        arg_1 &= var_32;
+        --var_30;
+        return Tester_Class_2.var_13 = 'n';
+    }
+
+    final static Object func_5()
+    {
+        var_28 = (Tester_Class_2)(! (var_31 |= true & var_31) ? (new Tester_Class_0[var_30])[var_30] : (var_28 = (new Tester_Class_0[var_30])[var_30]));
+        var_31 |= false;
+        return var_31 ? (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = (new Tester_Class_0[var_30 /= 1366944127])[var_30]) : (new Tester_Class_0[var_30][var_30])[var_30 += 1.4070924450257891E307][var_30];
+    }
+
+    static Tester_Class_2 func_6(final Object arg_0)
+    {
+        var_28 = (var_31 ^= true) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0;
+        ((new Tester[--var_30])[var_30]).var_29 -= -3.0029087E38F * (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k'));
+        var_28 = (Tester_Class_2)(var_28 = (var_28 = (var_28 = (Tester_Class_0)arg_0)));
+        return false ? new Tester_Class_2() : new Tester_Class_2();
+    }
+
+    private static Tester_Interface_1 func_7(byte arg_0, Tester_Class_2 arg_1, final int arg_2, char arg_3)
+    {
+        {
+            var_31 = var_31;
+            var_31 |= (var_31 &= (var_31 |= !true));
+            arg_0 += Tester_Class_2.var_14;
+        }
+        var_30 = (var_30 *= ((new Tester[arg_0 ^= 1039546367])[arg_0]).var_32);
+        arg_1.var_1 = (var_31 ^= (var_31 &= !var_31 && !var_31)) ? (arg_1 = (arg_1 = arg_1)) : (new Tester_Class_0[arg_0++][arg_0])[arg_0][arg_0];
+        arg_1.var_1 = var_31 ? "jpmg" : "epwvupaqp";
+        var_28 = arg_1;
+        if (false)
+        {
+            arg_1 = arg_1;
+        }
+        else
+        {
+            arg_3 += var_30 % -9.298157E37F;
+        }
+        arg_1.var_1 = ((var_28 = (var_28 = arg_1)).var_1 = ((var_28 = arg_1).var_1 = "rlmf"));
+        var_28 = (arg_1 = arg_1);
+        arg_1 = arg_1;
+        {
+            var_31 = true;
+        }
+        (arg_1 = arg_1).var_1 = (arg_1.var_1 = (arg_1 = arg_1));
+        final short[] var_43 = new short[(var_31 &= false) ? arg_0 : var_30];
+        final short var_44 = 18087;
+        return false ? (new Tester_Interface_1[var_30 %= Tester_Class_2.var_14])[arg_0 -= 8.913955E37F * +arg_0] : (new Tester_Interface_1[var_30])[var_30];
+    }
+
+    private static float func_8(final Object[] arg_0, final byte arg_1, Tester_Class_0[] arg_2)
+    {
+        ((new Tester_Class_2[var_30 /= -2.37832E38F])[((new Tester[arg_1])[(new byte[arg_1])[arg_1]]).var_32]).var_1 = new Tester_Interface_1[arg_1];
+        if (var_31)
+        {
+            var_28 = (Tester_Class_2)(var_28 = arg_2[var_30]);
+        }
+        else
+        {
+            var_30 -= Tester_Class_2.var_14;
+            final int var_45 = 1864933386;
+            final Tester_Class_0 var_46 = var_28 = (new Tester_Class_2[arg_1][var_30 |= Tester_Class_2.var_14])[((new Tester[arg_1][var_30])[var_30][var_30]).var_32][arg_1];
+            var_31 &= (var_31 ^= false);
+            var_30 += (false ? 2.7581227E37F : + +1.8832631E38F) * ('P' * -1.9479086E38F);
+        }
+        (var_28 = (Tester_Class_2)arg_2[arg_1]).var_1 = (new Tester_Class_2[var_30][arg_1][arg_1])[arg_1];
+        ++var_30;
+        (var_28 = (new Tester_Class_2[var_30])[arg_1]).var_1 = false ? (new Tester_Class_0[var_30][var_30])[var_30][arg_1] : arg_2[var_30];
+        var_31 |= false;
+        ((new Tester[arg_1][var_30 >>>= (char)1981599])[arg_1][arg_1]).var_29 = false ^ (var_31 = var_31) ? (Tester_Class_2.var_13 = "nes".charAt(1080898679)) : - (var_30 %= 'n') ^ arg_1;
+        {
+            ((new Tester[arg_1])[var_30]).var_29 = (short)(Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'h'));
+        }
+        Tester_Class_2.var_13 = 'j';
+        ((new Tester_Class_2[arg_1])[var_30]).var_1 = new byte[var_30];
+        var_31 ^= (var_31 ^= !false);
+        "wcbi".toString();
+        final byte var_47 = var_30;
+        if (true)
+        {
+            "mpbkilw".substring(199662864);
+        }
+        else
+        {
+            var_30++;
+        }
+        Tester_Class_2.var_13 = '`';
+        "yujypq".indexOf("crve" + "inmvh", false ? ~arg_1 : "vukbkc".charAt(528096652));
+        Tester_Class_2 var_48 = (Tester_Class_2)((!var_31 & (var_31 ^= false ^ !true) ? false | !true : false) ? (var_28 = (Tester_Class_2)arg_0[var_30]) : (new Tester_Class_2[arg_1])[var_30]);
+        return (float)(var_31 ^ var_31 ? (var_30 ^= (short)((new Tester[var_30])[var_30]).var_29) : (var_30 /= - -5.917837279005691E307 - - +3.2004715720509636E306));
+    }
+
+    final Tester_Class_0 func_9()
+    {
+        var_30 += -3531557622894482432L / ~var_30;
+        var_28 = (var_28 = (new Tester_Class_2[var_30 += + -7.0203367E37F])[var_30]);
+        var_31 ^= ! !false ^ false;
+        if (true)
+        {
+            byte[] var_49;
+            var_31 &= true;
+            short var_50 = 14869;
+        }
+        else
+        {
+            (((new Tester[var_32][var_30][var_32])[var_30])[var_32][var_30]).var_29 *= 'h';
+        }
+        final int var_51 = false ? +var_32 >>> ~var_30 : --var_30;
+        var_31 |= false;
+        return (new Tester_Class_0[var_32][var_32])[var_30][var_30];
+    }
+
+    public static Object func_10()
+    {
+        Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'O');
+        return ((Tester_Class_2)(new Object[--var_30])[var_30]).var_1 = (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = "iu");
+    }
+
+    protected byte func_11(final Tester_Interface_1[] arg_0)
+    {
+        {
+            --var_30;
+            var_29 *= (short)1749707986816114688L;
+            var_31 = (var_31 = (var_31 |= var_31));
+            var_30 -= 6.4575257E37F;
+        }
+        var_28 = (var_28 = func_9());
+        Tester_Class_2.var_13 = 'b';
+        var_30--;
+        var_28 = (var_28 = (var_28 = (var_28 = (Tester_Class_2)func_10())));
+        var_28 = (new Tester_Class_2[var_32])[var_30];
+        char var_52 = (var_31 = false) ? (char)+ +Tester_Class_2.var_14 : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = '_'));
+        if (false)
+        {
+            var_30 += (short)(var_32 + 840104459);
+        }
+        else
+        {
+            var_29 /= 2.5320765E38F;
+        }
+        if (true)
+        {
+            var_30 %= 379977167934025728L;
+        }
+        else
+        {
+            var_52 = var_52;
+        }
+        var_30 >>= ('A' ^ --var_30) & 'H';
+        Tester_Class_2 var_53;
+        final int var_54 = 771623383;
+        var_29 %= (+1.938582E37F - 'G') * ++var_30;
+        int var_55 = (short)6.234053079170724E306 - (int)'^' / ((var_31 &= (var_31 ^= var_31)) ? (short)var_30 : ++var_30);
+        var_55 >>>= var_55 / ~6865244393150017536L;
+        var_31 ^= !false;
+        return var_30 >>>= 4351766607072508928L >> func_0(var_32, var_31, 1.021781609675458E308);
+    }
+
+    public static String execute()
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { return t.toString(); }
+            catch (Throwable e) { return "Error during result conversion to String"; }
+        } catch (Throwable e) { return "Error during test execution"; }
+    }
+
+    public static void main(String[] args)
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { System.out.println(t); }
+            catch(Throwable e) { }
+        } catch (Throwable e) { }
+    }
+
+    private void test()
+    {
+        {
+            ((Tester_Class_2)(Tester_Class_0)((var_31 = true) ^ (var_31 |= false & true) ? func_10() : new Tester_Class_2[var_32])).var_1 = ((var_28 = new Tester_Class_0()).var_1 = (new Tester_Class_0().var_1 = new Tester_Class_2()));
+        }
+        new String();
+        Tester_Class_2.var_13 = '[';
+        var_28 = (Tester_Class_2)(((var_31 ^= true) ? func_9() : new Tester_Class_0()).var_1 = new Tester_Class_2());
+        var_28 = new Tester_Class_0();
+        new String();
+        {
+            if ((new boolean[var_30])[var_30] & 732877932 == 1.4654316E38F & "xpqy".replace(']', 'f').startsWith("pqrqunvfx") ? ((var_31 ^= (var_31 &= var_31)) ? !var_31 : (var_31 &= true)) : var_31)
+            {
+                var_31 &= var_31;
+            }
+            else
+            {
+                func_2(var_28 = new Tester_Class_0());
+            }
+            {
+                ((new Tester_Class_0[var_30][var_30])[var_30][var_30]).var_1 = "uwrbjvl";
+                var_28 = (Tester_Class_0)func_5();
+            }
+            Tester_Class_2.var_13 = 's';
+            Tester_Class_0 var_56 = var_28 = true ? func_6(func_5()) : (new Tester_Class_2[var_30][var_32])[var_32][var_32];
+            double var_57 = 0;
+            var_29 += 1024895641427426304L % ~ ~Tester_Class_2.var_14;
+            while ((true || (var_31 = var_31)) && var_57 < 12)
+            {
+                (false & !false ? var_56 : (var_56 = var_56)).var_1 = "vbc";
+                var_57++;
+                var_29 += func_0(var_30 /= (short)var_30 / var_32, false, var_57);
+                (var_31 ? (Tester_Class_2)var_56 : (new Tester_Class_2[var_30])[var_30]).var_1 = new double[var_31 ? (var_30 |= 177265600183083008L) : var_32];
+            }
+            switch (var_31 ^ var_31 | ! (var_31 = false) & (var_31 & false) ? (true ? (short)var_30 : func_0(var_30, true, var_57)) : func_0(var_30, var_31, var_29 /= 2.7203017E38F))
+            {
+                case 23:
+                    var_31 ^= true ? var_31 : var_31;
+                    break;
+
+                case 40:
+
+                default:
+
+                case 104:
+
+            }
+            Object var_58 = (var_31 ^= (var_31 ^= false) | (~3392263608888292352L < 1681682009 | var_31)) ? (((new Tester_Class_2[Tester_Class_2.func_5(Tester_Class_2.var_14, 3.3507317E38F, var_57)])[var_30 %= var_32]).var_1 = (var_56 = (Tester_Class_0)func_5())) : func_5();
+            (var_56 = (var_28 = (var_56 = func_6(var_58)))).var_1 = (((new Tester_Class_2[var_30])[var_30]).var_1 = new float[(byte)Tester_Class_2.var_14][var_32]);
+            new Tester_Class_2().var_1 = new double[var_30];
+            final Tester_Class_0 var_59 = var_28 = (!false & (false || (var_31 && !var_31) & false) ? var_31 : (var_31 |= !var_31)) ? (Tester_Class_2)(var_28 = new Tester_Class_2()) : (false ? new Tester_Class_2() : (Tester_Class_2)var_58);
+        }
+        var_30--;
+        {
+            var_29 += ~func_11(((new Tester_Interface_1[var_32][var_30][var_32])[var_30 ^= var_30])[var_32]);
+        }
+        float var_60 = 0F;
+        double var_61 = var_29;
+        do
+        {
+            long var_62;
+            var_60++;
+            "vcs".offsetByCodePoints((short)('w' | (short)var_30) & (new short[--var_30])[var_30], ((var_31 |= var_31) ^ (var_31 = var_31) ? var_32 : var_30) - (short)86413218);
+        } while (false && (var_60 < 100 && ((var_31 = false) ? var_31 : (var_31 ^= false)) & var_31));
+        long var_63 = 0L;
+        double var_64 = (var_31 ? (Tester_Class_2.var_13 = 'V') : 'e') - (var_29 = 'A') * (var_29 = var_30);
+        var_31 &= (short)+ var_30-- + var_30 <= var_60;
+        while (false && (var_63 < 23 && false))
+        {
+            var_30 >>= func_0(var_30, var_31, var_29) ^ ("".endsWith("mecvlajq" + "jhrbf") ? var_30 : (short)var_61);
+            var_63++;
+            var_28 = (Tester_Class_2)(var_28 = new Tester_Class_2());
+            new Tester_Class_0();
+        }
+        double var_65 = 0;
+        var_61 -= var_65;
+        for (((var_31 &= (var_31 ^= var_31)) | var_31 ? new Tester_Class_2() : new Tester_Class_2()).var_1 = ! (var_31 = false) && !var_31 ? func_10() : new Object[var_32][var_32]; var_31 | var_31 && (var_65 < 107 && (false ? !var_31 : (var_31 &= var_31))); var_30 *= Tester_Class_2.var_14)
+        {
+            var_28 = var_30 > (var_31 | true ? (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')) : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'r'))) ? (Tester_Class_2)((var_28 = (Tester_Class_0)func_5()).var_1 = func_5()) : new Tester_Class_2();
+            var_65++;
+            var_29 = "efothsl".startsWith("qk") ? 3.2306712E37F : +1.1835607464479516E308;
+            new Tester_Class_2().var_1 = new Tester_Class_0();
+        }
+        double var_66 = 0;
+        func_6(((Tester_Class_2)((true ? (Tester_Class_2)func_10() : (Tester_Class_2)func_9()).var_1 = (var_28 = (Tester_Class_2)func_10()))).var_1 = "");
+        while (false | (new boolean[var_30][var_30])[var_30][var_32] && (var_66 < 104 && false))
+        {
+            ((var_31 ^= !false) ? "" : "slgr").toUpperCase();
+            var_66++;
+            var_28 = func_6(func_9().var_1 = func_10());
+            var_31 |= (var_31 |= true);
+        }
+        Tester_Class_2.var_13 = var_31 ? (Tester_Class_2.var_13 = 'Y') : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = func_4(var_63, 137999726, 1870981930))));
+        int var_67 = 0;
+        final double var_68 = 9.955130040461458E307;
+        do
+        {
+            "".lastIndexOf(var_32 != (Tester_Class_2.var_13 = 'f') ? (Tester_Class_2.var_13 = 'C') : ~var_30, (char)3.187607E38F + (var_30 /= var_30));
+            var_67++;
+            Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'B');
+        } while (var_67 < 9 && var_31 ^ var_31);
+        int var_69 = 0;
+        (true ? func_6(func_10()) : (Tester_Class_2)func_9()).var_1 = ((var_28 = (var_28 = new Tester_Class_2())).var_1 = (func_6(new Tester_Class_2().var_1 = new Tester_Class_0()).var_1 = (Tester_Class_2)func_9()));
+        do
+        {
+            var_28 = (Tester_Class_2)(var_28 = (Tester_Class_0)(new Tester_Class_2().var_1 = "qs"));
+            var_69++;
+            var_31 ^= var_31;
+        } while (var_69 < 189);
+        (! (var_31 = true) | var_31 ? new Tester_Class_2() : (new Tester_Class_0[var_30])[var_30]).var_1 = (((new Tester_Class_2[var_30 ^= (short)var_30])[var_30]).var_1 = (var_31 ? var_31 : (var_31 |= false)) ? "lfhliyphg" : "impovq");
+        ((var_31 ? var_32 == (short)8901596111720974336L : 220705842 != var_60) ? (new Tester_Class_2[var_30])[var_32] : (new Tester_Class_2[var_30][var_32])[var_30][var_30]).var_1 = (var_28 = ((char)var_30 >= "pngjthlf".lastIndexOf("jjbuojp") & var_31 ? var_31 : var_31) ? (new Tester_Class_2[var_32])[var_30] : func_6(new Tester_Class_2().var_1 = new String[var_32]));
+        Tester_Class_2.var_13 = 'c';
+    }
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester.var_29 = "; result += Printer.print(var_29);
+        result += "\n";
+        result += "Tester.var_30 = "; result += Printer.print(var_30);
+        result += "\n";
+        result += "Tester.var_32 = "; result += Printer.print(var_32);
+        result += "\n";
+        result += "Tester.var_31 = "; result += Printer.print(var_31);
+        result += "\n";
+        result += "Tester.var_28 = "; result += Printer.print(var_28);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+    static class Printer
+    {
+        public static String print(boolean arg) { return String.valueOf(arg); }
+        public static String print(byte arg)    { return String.valueOf(arg); }
+        public static String print(short arg)   { return String.valueOf(arg); }
+        public static String print(char arg)    { return String.valueOf((int)arg); }
+        public static String print(int arg)     { return String.valueOf(arg); }
+        public static String print(long arg)    { return String.valueOf(arg); }
+        public static String print(float arg)   { return String.valueOf(arg); }
+        public static String print(double arg)  { return String.valueOf(arg); }
+
+
+        public static String print(Object arg)
+        {
+            return print_r(new java.util.Stack(), arg);
+        }
+
+        private static String print_r(java.util.Stack visitedObjects, Object arg)
+        {
+            String result = "";
+            if (arg == null)
+                result += "null";
+            else
+            if (arg.getClass().isArray())
+            {
+                for (int i = 0; i < visitedObjects.size(); i++)
+                    if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+                visitedObjects.push(arg);
+
+                final String delimiter = ", ";
+                result += "[";
+
+                if (arg instanceof Object[])
+                {
+                    Object[] array = (Object[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print_r(visitedObjects, array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof boolean[])
+                {
+                    boolean[] array = (boolean[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof byte[])
+                {
+                    byte[] array = (byte[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof short[])
+                {
+                    short[] array = (short[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof char[])
+                {
+                    char[] array = (char[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof int[])
+                {
+                     int[] array = (int[]) arg;
+                     for (int i = 0; i < array.length; i++)
+                     {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                     }
+                }
+                else
+                if (arg instanceof long[])
+                {
+                    long[] array = (long[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof float[])
+                {
+                    float[] array = (float[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof double[])
+                {
+                    double[] array = (double[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+
+                result += "]";
+                visitedObjects.pop();
+
+            } else
+            {
+                result += arg.toString();
+            }
+
+            return result;
+        }
+    }
+}
+
+
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 73dafe8..f4f91fe 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -4,3 +4,4 @@
 bafed478d67c3acf7744aaad88b9404261ea6739 jdk7-b27
 b996318955c0ad8e9fa0ffb56c74f626786e863f jdk7-b28
 617ee8607cfd5fd81f233f3c0b690f85084687a0 jdk7-b29
+2d94a238a1641d074e6032dcdceed461d6f85d6a jdk7-b30
diff --git a/jaxws/.hgtags b/jaxws/.hgtags
index 7e2548c..8bfe2a4 100644
--- a/jaxws/.hgtags
+++ b/jaxws/.hgtags
@@ -4,3 +4,4 @@
 27d8f42862c11b4ddc4af2dd2d2a3cd86cda04c2 jdk7-b27
 eefcd5204500a11d6aa802dca9f961cf10ab64c2 jdk7-b28
 836c55713abab186e4de0c6eabd06ff008c7b8d0 jdk7-b29
+7f2466f8cc7009702e548d1a763254f546024d7e jdk7-b30
diff --git a/jdk/.hgtags b/jdk/.hgtags
index dc6a5d6..282129a 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -4,3 +4,4 @@
 3e599d98875ddf919c8ea11cff9b3a99ba631a9b jdk7-b27
 02e4c5348592a8d7fc2cba28bc5f8e35c0e17277 jdk7-b28
 e21f4266466cd1306b176aaa08b2cd8337a9be3d jdk7-b29
+b6d6877c1155621a175dccd12dc14c54f938fb8b jdk7-b30
diff --git a/jdk/make/common/shared/Platform.gmk b/jdk/make/common/shared/Platform.gmk
index 2d9b007..abf9396 100644
--- a/jdk/make/common/shared/Platform.gmk
+++ b/jdk/make/common/shared/Platform.gmk
@@ -72,7 +72,6 @@
 #     ISA_DIR                     solaris only: /sparcv9 or /amd64
 #     LIBARCH32                   solaris only: sparc or i386
 #     LIBARCH64                   solaris only: sparcv9 or amd64
-#     REQUIRED_WINDOWS_NAME       windows only: basic name of windows 
 #     REQUIRED_WINDOWS_VERSION    windows only: specific version of windows 
 #     USING_CYGWIN                windows only: true or false
 #     WINDOWS_NT_VERSION_STRING   windows only: long version name
@@ -311,19 +310,11 @@
     endif
   endif
   export ARCH_DATA_MODEL
-  # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
-  ARCH=i586
-  LIBARCH=i386
-  # Value of Java os.arch property
-  ARCHPROP=x86
-  REQUIRED_WINDOWS_NAME=Windows Professional 2000
-  REQUIRED_WINDOWS_VERSION=5 0 Service Pack 4
   ifeq ($(ARCH_DATA_MODEL), 64)
     # If the user wants to perform a cross compile build then they must
     # - set ARCH_DATA_MODEL=64 and either
     #      + set ARCH to ia64 or amd64, or
-    REQUIRED_WINDOWS_NAME=Windows Server 2003
-    REQUIRED_WINDOWS_VERSION=5 2 Service Pack 1
+    REQUIRED_WINDOWS_VERSION=Server 2003 Enterprise x64 Edition
     ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64)
       ARCH=amd64
     else
@@ -332,6 +323,14 @@
     LIBARCH=$(ARCH)
     # Value of Java os.arch property
     ARCHPROP=$(LIBARCH)
+  else
+    REQUIRED_WINDOWS_VERSION=2000 or Unknown
+    #REQUIRED_WINDOWS_VERSION=XP Professional
+    # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
+    ARCH=i586
+    LIBARCH=i386
+    # Value of Java os.arch property
+    ARCHPROP=x86
   endif
   ARCH_FAMILY = $(ARCH)
   # Where is unwanted output to be delivered?
diff --git a/jdk/make/common/shared/Sanity.gmk b/jdk/make/common/shared/Sanity.gmk
index 7a8eb11..8239e00 100644
--- a/jdk/make/common/shared/Sanity.gmk
+++ b/jdk/make/common/shared/Sanity.gmk
@@ -82,15 +82,16 @@
 endif
 
 ifeq ($(PLATFORM), windows)
-  WINVER=$(JDK_TOPDIR)/make/tools/winver/bin/winver.exe
   FREE_SPACE := $(shell $(DF) -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
   TEMP_FREE_SPACE := $(shell $(DF) -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
-  WINDOWS_VERSION := $(shell \
-      if [ -x $(WINVER) ]; then \
-	$(WINVER) ; \
-      else \
-	$(ECHO) "Unknown Windows Version"; \
-      fi)
+  # Localized systeminfo has localized labels, but not localized values.
+  _WINDOWS_VERSION := \
+    $(shell systeminfo 2> $(DEV_NULL) | grep 'Microsoft' | grep 'Windows' | \
+	 cut -d':' -f2)
+  ifeq ($(_WINDOWS_VERSION),)
+    _WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility)
+  endif
+  WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION))
   DXSDK_VER := $(shell $(EGREP) DIRECTDRAW_VERSION $(DXSDK_INCLUDE_PATH)/ddraw.h 2>&1 | \
     $(EGREP) "\#define" | $(NAWK) '{print $$3}')
 endif
@@ -264,9 +265,9 @@
 	    "" >> $(WARNING_FILE) ; \
 	fi
   ifeq ($(PLATFORM), windows)
-	@if [ "$(WINDOWS_VERSION)" != "$(REQUIRED_WINDOWS_VERSION)" ]; then \
-	    $(ECHO) "WARNING: $(YOU_ARE_USING) an unsupported version of $(REQUIRED_WINDOWS_NAME). \n" \
-	      "        The supported version is $(REQUIRED_WINDOWS_NAME) $(REQUIRED_WINDOWS_VERSION). \n" \
+	@if [ "$(findstring $(REQUIRED_WINDOWS_VERSION),$(WINDOWS_VERSION))" = "" ]; then \
+	    $(ECHO) "WARNING: $(YOU_ARE_USING) an unknown version of Windows. \n" \
+	      "        The required version is $(REQUIRED_WINDOWS_VERSION). \n" \
 	      "        $(YOU_ARE_USING) $(WINDOWS_VERSION) \n" \
 	      "" >> $(WARNING_FILE) ; \
 	fi
diff --git a/jdk/make/tools/Makefile b/jdk/make/tools/Makefile
index 36be60e..1b3c406 100644
--- a/jdk/make/tools/Makefile
+++ b/jdk/make/tools/Makefile
@@ -51,7 +51,6 @@
   jdwpgen                   \
   makeclasslist             \
   strip_properties          \
-  winver                    \
   CharsetMapping
 
 all build clean clobber::
diff --git a/jdk/make/tools/winver/Makefile b/jdk/make/tools/winver/Makefile
deleted file mode 100644
index 9b8638a..0000000
--- a/jdk/make/tools/winver/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# Copyright 1998-2005 Sun Microsystems, Inc.  All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.  Sun designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Sun in the LICENSE file that accompanied this code.
-#
-# This code 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
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-#
-
-#
-# Makefile for building the winver tool
-#
-
-BUILDDIR = ../..
-PRODUCT = tools
-PROGRAM = winver
-include $(BUILDDIR)/common/Defs.gmk
-
-build: permissions
-
-permissions:
-ifeq ($(PLATFORM),windows)
-	$(CHMOD) a+x bin/winver.exe
-endif
-
-#
-# Rules.
-#
-include $(BUILDDIR)/common/Rules.gmk
-
-.PHONY: permissions
-
diff --git a/jdk/make/tools/winver/bin/winver.exe b/jdk/make/tools/winver/bin/winver.exe
deleted file mode 100755
index cba45be..0000000
--- a/jdk/make/tools/winver/bin/winver.exe
+++ /dev/null
Binary files differ
diff --git a/jdk/make/tools/winver/src/StdAfx.cpp b/jdk/make/tools/winver/src/StdAfx.cpp
deleted file mode 100644
index a7169bc..0000000
--- a/jdk/make/tools/winver/src/StdAfx.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-// stdafx.cpp : source file that includes just the standard includes
-//      getver.pch will be the pre-compiled header
-//      stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-// TODO: reference any additional headers you need in STDAFX.H
-// and not in this file
diff --git a/jdk/make/tools/winver/src/StdAfx.h b/jdk/make/tools/winver/src/StdAfx.h
deleted file mode 100644
index 3e94079..0000000
--- a/jdk/make/tools/winver/src/StdAfx.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-// stdafx.h : include file for standard system include files,
-//  or project specific include files that are used frequently, but
-//      are changed infrequently
-//
-
-#if !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
-#define AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
-
-#include <stdio.h>
-
-// TODO: reference additional headers your program requires here
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
-
-#endif // !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
diff --git a/jdk/make/tools/winver/src/winver.cpp b/jdk/make/tools/winver/src/winver.cpp
deleted file mode 100644
index 6497b9e..0000000
--- a/jdk/make/tools/winver/src/winver.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-// getver.cpp : Defines the entry point for the console application.
-//
-
-#include "stdafx.h"
-#include <windows.h>
-
-int main(int argc, char* argv[])
-{
-        OSVERSIONINFO verInfo;
-
-        memset(&verInfo,0,sizeof(verInfo));
-        verInfo.dwOSVersionInfoSize = sizeof(verInfo);
-
-        if (GetVersionEx(&verInfo))
-        {
-                printf("%d %d %s",verInfo.dwMajorVersion,verInfo.dwMinorVersion,verInfo.szCSDVersion);
-        }
-        else
-        {
-                printf("No version info available");
-        }
-
-        return 0;
-}
diff --git a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java
index e883373..7562f58 100644
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1145,6 +1145,10 @@
                 sharedState.put(NAME, username);
                 sharedState.put(PWD, password);
             }
+        } else {
+            // remove temp results for the next try
+            encKeys = null;
+            principal = null;
         }
         username = null;
         password = null;
diff --git a/jdk/src/share/classes/java/nio/charset/Charset.java b/jdk/src/share/classes/java/nio/charset/Charset.java
index 7f6d6fc..98f504d 100644
--- a/jdk/src/share/classes/java/nio/charset/Charset.java
+++ b/jdk/src/share/classes/java/nio/charset/Charset.java
@@ -188,21 +188,22 @@
  * <ul>
  *
  *   <li><p> When decoding, the <tt>UTF-16BE</tt> and <tt>UTF-16LE</tt>
- *   charsets ignore byte-order marks; when encoding, they do not write
+ *   charsets interpret the initial byte-order marks as a <small>ZERO-WIDTH
+ *   NON-BREAKING SPACE</small>; when encoding, they do not write
  *   byte-order marks. </p></li>
+
  *
- *   <li><p> When decoding, the <tt>UTF-16</tt> charset interprets a byte-order
- *   mark to indicate the byte order of the stream but defaults to big-endian
- *   if there is no byte-order mark; when encoding, it uses big-endian byte
- *   order and writes a big-endian byte-order mark. </p></li>
+ *   <li><p> When decoding, the <tt>UTF-16</tt> charset interprets the
+ *   byte-order mark at the beginning of the input stream to indicate the
+ *   byte-order of the stream but defaults to big-endian if there is no
+ *   byte-order mark; when encoding, it uses big-endian byte order and writes
+ *   a big-endian byte-order mark. </p></li>
  *
  * </ul>
  *
- * In any case, when a byte-order mark is read at the beginning of a decoding
- * operation it is omitted from the resulting sequence of characters.  Byte
- * order marks occuring after the first element of an input sequence are not
- * omitted since the same code is used to represent <small>ZERO-WIDTH
- * NON-BREAKING SPACE</small>.
+ * In any case, byte order marks occuring after the first element of an
+ * input sequence are not omitted since the same code is used to represent
+ * <small>ZERO-WIDTH NON-BREAKING SPACE</small>.
  *
  * <p> Every instance of the Java virtual machine has a default charset, which
  * may or may not be one of the standard charsets.  The default charset is
diff --git a/jdk/src/share/classes/sun/nio/ch/Util.java b/jdk/src/share/classes/sun/nio/ch/Util.java
index 5fff6d3..7aedce2 100644
--- a/jdk/src/share/classes/sun/nio/ch/Util.java
+++ b/jdk/src/share/classes/sun/nio/ch/Util.java
@@ -142,11 +142,10 @@
             || ((sel = selWrapper.get()) == null)
             || (sel.provider() != sc.provider())) {
             sel = sc.provider().openSelector();
-            localSelector.set(new SoftReference<SelectorWrapper>(
-                                  new SelectorWrapper(sel)));
-        } else {
-            localSelectorWrapper.set(selWrapper);
+            selWrapper = new SelectorWrapper(sel);
+            localSelector.set(new SoftReference<SelectorWrapper>(selWrapper));
         }
+        localSelectorWrapper.set(selWrapper);
         return sel;
     }
 
diff --git a/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java b/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java
index 9b065be..40872d7 100644
--- a/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java
@@ -59,7 +59,7 @@
     private int i;
     private NameConstraintsExtension prevNC;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     /**
      * Creates a ConstraintsChecker.
diff --git a/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java b/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java
index e60e4c9d..aa88603 100644
--- a/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -198,6 +198,11 @@
         X509CertSelector sel = null;
 
         if (currentState.isInitial()) {
+            if (targetCertConstraints.getBasicConstraints() == -2) {
+                // no need to continue: this means we never can match a CA cert
+                return;
+            }
+
             /* This means a CA is the target, so match on same stuff as
              * getMatchingEECerts
              */
diff --git a/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java b/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java
index e1a98ea..1ed96c5 100644
--- a/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java
+++ b/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java
@@ -50,7 +50,7 @@
     private CertSelector targetConstraints;
     private int remainingCerts;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     /**
      * Default Constructor
diff --git a/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java b/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java
index a94d0f2..3b76f62 100644
--- a/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java
+++ b/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java
@@ -68,7 +68,7 @@
     private int inhibitAnyPolicy;
     private int certIndex;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     private static final Debug debug = Debug.getInstance("certpath");
     static final String ANY_POLICY = "2.5.29.32.0";
diff --git a/jdk/src/windows/native/java/io/io_util_md.c b/jdk/src/windows/native/java/io/io_util_md.c
index a697c5d..6fd202a 100644
--- a/jdk/src/windows/native/java/io/io_util_md.c
+++ b/jdk/src/windows/native/java/io/io_util_md.c
@@ -104,23 +104,56 @@
     }
 }
 
+/*
+  The "abpathlen" is the size of the buffer needed by _wfullpath. If the
+  "path" is a relative path, it is "the length of the current dir" + "the
+  length of the path", if it's "absolute" already, it's the same as
+  pathlen which is the length of "path".
+ */
+WCHAR* prefixAbpath(const WCHAR* path, int pathlen, int abpathlen) {
+    WCHAR* pathbuf = NULL;
+    WCHAR* abpath = NULL;
+
+    abpathlen += 10;  //padding
+    abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
+    if (abpath) {
+        /* Collapse instances of "foo\.." and ensure absoluteness before
+           going down to prefixing.
+        */
+        if (_wfullpath(abpath, path, abpathlen)) {
+            pathbuf = getPrefixed(abpath, abpathlen);
+        } else {
+            /* _wfullpath fails if the pathlength exceeds 32k wchar.
+               Instead of doing more fancy things we simply copy the
+               ps into the return buffer, the subsequent win32 API will
+               probably fail with FileNotFoundException, which is expected
+            */
+            pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
+            if (pathbuf != 0) {
+                wcscpy(pathbuf, path);
+            }
+        }
+        free(abpath);
+    }
+    return pathbuf;
+}
+
 /* If this returns NULL then an exception is pending */
 WCHAR*
 pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) {
     int pathlen = 0;
     WCHAR *pathbuf = NULL;
-    int max_path = 248;   /* Since CreateDirectoryW() has the limit of
-                             248 instead of the normal MAX_PATH, we
-                             use 248 as the max_path to satisfy both
-                           */
+    int max_path = 248; /* CreateDirectoryW() has the limit of 248 */
+
     WITH_UNICODE_STRING(env, path, ps) {
         pathlen = wcslen(ps);
         if (pathlen != 0) {
             if (pathlen > 2 &&
                 (ps[0] == L'\\' && ps[1] == L'\\' ||   //UNC
-                 ps[1] == L':' && ps[2] == L'\\')) {   //absolute
+                 ps[1] == L':' && ps[2] == L'\\'))     //absolute
+            {
                  if (pathlen > max_path - 1) {
-                     pathbuf = getPrefixed(ps, pathlen);
+                     pathbuf = prefixAbpath(ps, pathlen, pathlen);
                  } else {
                      pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
                      if (pathbuf != 0) {
@@ -132,7 +165,7 @@
                    its absolute form is bigger than max_path or not, if yes
                    need to (1)convert it to absolute and (2)prefix. This is
                    obviously a burden to all relative paths (The current dir/len
-                   for "dirve & directory" relative path is cached, so we only
+                   for "drive & directory" relative path is cached, so we only
                    calculate it once but for "drive-relative path we call
                    _wgetdcwd() and wcslen() everytime), but a hit we have
                    to take if we want to support relative path beyond max_path.
@@ -143,24 +176,7 @@
                 WCHAR *abpath = NULL;
                 int dirlen = currentDirLength(ps, pathlen);
                 if (dirlen + pathlen + 1 > max_path - 1) {
-                    int abpathlen = dirlen + pathlen + 10;
-                    abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
-                    if (abpath) {
-                        if (_wfullpath(abpath, ps, abpathlen)) {
-                            pathbuf = getPrefixed(abpath, abpathlen);
-                        } else {
-                            /* _wfullpath fails if the pathlength exceeds 32k wchar.
-                               Instead of doing more fancy things we simply copy the
-                               ps into the return buffer, the subsequent win32 API will
-                               probably fail with FileNotFoundException, which is expected
-                             */
-                            pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
-                            if (pathbuf != 0) {
-                                wcscpy(pathbuf, ps);
-                            }
-                        }
-                        free(abpath);
-                    }
+                    pathbuf = prefixAbpath(ps, pathlen, dirlen + pathlen);
                 } else {
                     pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
                     if (pathbuf != 0) {
diff --git a/jdk/test/java/io/File/MaxPath.java b/jdk/test/java/io/File/MaxPath.java
new file mode 100644
index 0000000..115f05e
--- /dev/null
+++ b/jdk/test/java/io/File/MaxPath.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6481955
+   @summary Path length less than MAX_PATH (260) works on Windows
+ */
+
+import java.io.*;
+
+public class MaxPath {
+    public static void main(String[] args) throws Exception {
+        String osName = System.getProperty("os.name");
+        if (!osName.startsWith("Windows")) {
+            return;
+        }
+        int MAX_PATH = 260;
+        String dir = new File(".").getAbsolutePath() + "\\";
+        String padding = "1234567890123456789012345678901234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890";
+        for (int i = 240 - dir.length(); i < MAX_PATH - dir.length(); i++) {
+            String longname = dir + padding.substring(0, i);
+            try {
+                File f = new File(longname);
+                if (f.createNewFile()) {
+                    if (!f.exists() || !f.canRead()) {
+                        throw new RuntimeException("Failed at length: " + longname.length());
+                    }
+                    f.delete();
+                }
+            } catch (IOException e) {
+                System.out.println("Failed at length: " + longname.length());
+                throw e;
+            }
+        }
+    }
+}
diff --git a/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java b/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java
index 068e6d0..eb20ef4 100644
--- a/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java
+++ b/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java
@@ -22,7 +22,7 @@
  */
 
 /* @test
-   @bug 5105464 6269047
+   @bug 5105464 6269047 6541631
  * @summary Test to transfer bytes with a size bigger than Integer.MAX_VALUE
  */
 
@@ -81,9 +81,11 @@
         System.out.println("LongTransferTest-main: OK!");
 
         socket.close();
-
         server.close();
 
+        inChannel.close();
+        outChannel.close();
+
         inFile.delete();
         outFile.delete();
     }
diff --git a/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java
new file mode 100644
index 0000000..0ec0be6
--- /dev/null
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6714842
+ * @library ../../../testlibrary
+ * @build CertUtils
+ * @run main BuildEEBasicConstraints
+ * @summary make sure a PKIX CertPathBuilder builds a path to an
+ *      end entity certificate when the setBasicConstraints method of the
+ *      X509CertSelector of the targetConstraints PKIXBuilderParameters
+ *      parameter is set to -2.
+ */
+
+import java.security.cert.Certificate;
+import java.security.cert.CertPath;
+import java.security.cert.CertStore;
+import java.security.cert.CollectionCertStoreParameters;
+import java.security.cert.PKIXBuilderParameters;
+import java.security.cert.PKIXCertPathBuilderResult;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.security.cert.X509CertSelector;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class BuildEEBasicConstraints {
+
+    public static void main(String[] args) throws Exception {
+
+        X509Certificate rootCert = CertUtils.getCertFromFile("anchor.cer");
+        TrustAnchor anchor = new TrustAnchor
+            (rootCert.getSubjectX500Principal(), rootCert.getPublicKey(), null);
+        X509CertSelector sel = new X509CertSelector();
+        sel.setBasicConstraints(-2);
+        PKIXBuilderParameters params = new PKIXBuilderParameters
+            (Collections.singleton(anchor), sel);
+        params.setRevocationEnabled(false);
+        X509Certificate eeCert = CertUtils.getCertFromFile("ee.cer");
+        X509Certificate caCert = CertUtils.getCertFromFile("ca.cer");
+        ArrayList<X509Certificate> certs = new ArrayList<X509Certificate>();
+        certs.add(caCert);
+        certs.add(eeCert);
+        CollectionCertStoreParameters ccsp =
+            new CollectionCertStoreParameters(certs);
+        CertStore cs = CertStore.getInstance("Collection", ccsp);
+        params.addCertStore(cs);
+        PKIXCertPathBuilderResult res = CertUtils.build(params);
+        CertPath cp = res.getCertPath();
+        // check that first certificate is an EE cert
+        List<? extends Certificate> certList = cp.getCertificates();
+        X509Certificate cert = (X509Certificate) certList.get(0);
+        if (cert.getBasicConstraints() != -1) {
+            throw new Exception("Target certificate is not an EE certificate");
+        }
+    }
+}
diff --git a/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer
new file mode 100644
index 0000000..bfb5d58
--- /dev/null
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer
@@ -0,0 +1,8 @@
+-----BEGIN CERTIFICATE-----
+MIIBFzCBwgIBATANBgkqhkiG9w0BAQQFADAXMRUwEwYDVQQDEwxUcnVzdCBBbmNo

+b3IwHhcNMDIxMTA3MTE1NzAzWhcNMjIxMTA3MTE1NzAzWjAXMRUwEwYDVQQDEwxU

+cnVzdCBBbmNob3IwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA9uCj12hwDgC1n9go

+0ozQAVMM+DfX0vpKOemyGNp+ycSLfAq3pxBcUKbQhjSRL7YjPkEL8XC6pRLwyEoF

+osWweQIDAQABMA0GCSqGSIb3DQEBBAUAA0EAzZta5M1qbbozj7jWnNyTgB4HUpzv

+4eP0VYQb1pQY1/xEMczaRt+RuoIDnHCq5a1vOiwk6ZbdG6GlJKx9lj0oMQ==
+-----END CERTIFICATE-----
diff --git a/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer
new file mode 100644
index 0000000..26ffb68
--- /dev/null
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBSjCB9aADAgECAgECMA0GCSqGSIb3DQEBBAUAMBcxFTATBgNVBAMTDFRydXN0

+IEFuY2hvcjAeFw0wMjExMDcxMTU3MDNaFw0yMjExMDcxMTU3MDNaMA0xCzAJBgNV

+BAMTAkNBMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ8mP3x37PablDfwldGL5G0+

+l9NgMJSdxVNWBg+ySzQNsZklEFCxGfxPQW+EFYfafHbTbmnni2gsgU1mgPBTQDsC

+AwEAAaM2MDQwCwYDVR0PBAQDAgIEMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADAM

+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EA9oCyzh0UKmNsKb+KpppbKYs8

+iA8sDm9oDCwyVSXBM46zrP38nRcx3EdKFvGTwbb/Np+lcZALUsKVYQy3rlU+cQ==
+-----END CERTIFICATE-----
diff --git a/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer
new file mode 100644
index 0000000..f20c937
--- /dev/null
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBLTCB2KADAgECAgEDMA0GCSqGSIb3DQEBBAUAMA0xCzAJBgNVBAMTAkNBMB4X

+DTAyMTEwNzExNTcwM1oXDTIyMTEwNzExNTcwM1owFTETMBEGA1UEAxMKRW5kIEVu

+dGl0eTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDVBDfF+uBr5s5jzzDs1njKlZNt

+h8hHzEt3ASh67Peos+QrDzgpUyFXT6fdW2h7iPf0ifjM8eW2xa+3EnPjjU5jAgMB

+AAGjGzAZMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADANBgkqhkiG9w0BAQQFAANB

+AFo//WOboCNOCcA1fvcWW9oc4MvV8ZPvFIAbyEbgyFd4id5lGDTRbRPvvNZRvdsN

+NM2gXYr+f87NHIXc9EF3pzw=
+-----END CERTIFICATE-----
diff --git a/jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java b/jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java
new file mode 100644
index 0000000..c7b54a1
--- /dev/null
+++ b/jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4834154
+   @summary Decode a file using EUC-TW, test for decode errors
+ */
+
+/*
+ * Tests for decode errors in NIO EUC-TW decoder. 4734607 details
+ * decoding errors which occur when the input file > 8k in size
+ * and contains numerous US-ASCII range chars
+ */
+
+import java.io.*;
+
+public class BufferUnderflowEUCTWTest {
+    private static int BUFFERSIZE = 8194;
+
+    public static void main (String[] args) throws Exception {
+        int i = 0;
+        byte[] b = new byte[BUFFERSIZE];
+
+        for (; i < BUFFERSIZE - 4; i++) // pad with zeroes
+            b[i] = 0;
+
+        // Overspill a valid EUC-TW 4 byte sequence between 2
+        // successive input buffers.
+        b[i++] = (byte)0x8E;
+        b[i++] = (byte)0xA2;
+        b[i++] = (byte)0xA1;
+        b[i++] = (byte)0xA6;
+
+        ByteArrayInputStream r = new ByteArrayInputStream(b);
+
+        try {
+            InputStreamReader isr=new InputStreamReader(r, "EUC-TW");
+            char[] cc = new char[BUFFERSIZE];
+            int cx = isr.read(cc);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            throw new Exception("Array Index error: bug 4834154");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java b/jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java
new file mode 100644
index 0000000..3a96a76
--- /dev/null
+++ b/jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4216191 4721369 4807283
+   @summary Test to validate case insensitivity of encoding alias names
+ */
+
+// Fixed since 1.4.0 by virtue of NIO charset lookup mechanism
+// which is by design case insensitive
+
+import java.lang.*;
+import java.io.*;
+
+public class CheckCaseInsensitiveEncAliases
+{
+  public static void main(String args[]) throws Exception
+  {
+    // Try various encoding names in mixed cases
+    // Tests subset of encoding names provided within bugID 4216191
+
+    // Various forms of US-ASCII
+    tryToEncode( "ANSI_X3.4-1968" );
+    tryToEncode( "iso-ir-6" );
+    tryToEncode( "ANSI_X3.4-1986" );
+    tryToEncode( "ISO_646.irv:1991" );
+    tryToEncode( "ASCII" );
+    tryToEncode( "ascii" );
+    tryToEncode( "Ascii" );
+    tryToEncode( "Ascii7" );
+    tryToEncode( "ascii7" );
+    tryToEncode( "ISO646-US" );
+    tryToEncode( "US-ASCII" );
+    tryToEncode( "us-ascii" );
+    tryToEncode( "US-Ascii" );
+    tryToEncode( "us" );
+    tryToEncode( "IBM367" );
+    tryToEncode( "cp367" );
+    tryToEncode( "csASCII" );
+
+    // Variants on Unicode
+    tryToEncode( "Unicode" );
+    tryToEncode( "UNICODE" );
+    tryToEncode( "unicode" );
+
+    // Variants on Big5
+    tryToEncode( "Big5" );
+    tryToEncode( "big5" );
+    tryToEncode( "bIg5" );
+    tryToEncode( "biG5" );
+    tryToEncode( "bIG5" );
+
+    // Variants of Cp1252
+    tryToEncode( "Cp1252" );
+    tryToEncode( "cp1252" );
+    tryToEncode( "CP1252" );
+
+    // Variants of PCK
+    tryToEncode( "pck" );
+    tryToEncode( "Pck" );
+
+  }
+
+
+  public static final String ENCODE_STRING = "Encode me";
+
+  public static void tryToEncode( String encoding) throws Exception
+  {
+    try
+    {
+      byte[] bytes = ENCODE_STRING.getBytes( encoding );
+      System.out.println( "Encoding \"" + encoding + "\" recognized" );
+    }
+    catch( UnsupportedEncodingException e )
+    {
+      throw new Exception("Encoding \"" + encoding + "\" NOT recognized");
+    }
+  }
+}
diff --git a/jdk/test/sun/nio/cs/CheckHistoricalNames.java b/jdk/test/sun/nio/cs/CheckHistoricalNames.java
new file mode 100644
index 0000000..0e233b6
--- /dev/null
+++ b/jdk/test/sun/nio/cs/CheckHistoricalNames.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4513767 4961027
+   @summary Checks canonical names match between old and (NIO) core charsets
+ */
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+public class CheckHistoricalNames {
+    static int failed = 0;
+    public static void main (String[] args) throws Exception {
+        checkHistoricalName("ASCII");
+        checkHistoricalName("Cp1252");
+        checkHistoricalName("ISO8859_1");
+        checkHistoricalName("UnicodeBigUnmarked");
+        checkHistoricalName("UnicodeLittle");
+        checkHistoricalName("UnicodeLittleUnmarked");
+        checkHistoricalName("UTF8");
+        checkHistoricalName("UTF-16");
+
+        checkMappedName("UnicodeBig", "UTF-16");
+        checkMappedName("US-ASCII", "ASCII");
+        checkMappedName("ISO-8859-1", "ISO8859_1");
+        checkMappedName("UTF-8", "UTF8");
+        checkMappedName("UTF-16BE", "UnicodeBigUnmarked");
+        checkMappedName("UTF-16LE", "UnicodeLittleUnmarked");
+
+        checkHistoricalName("ISO8859_2");
+        checkHistoricalName("ISO8859_4");
+        checkHistoricalName("ISO8859_5");
+        checkHistoricalName("ISO8859_7");
+        checkHistoricalName("ISO8859_9");
+        checkHistoricalName("ISO8859_13");
+        checkHistoricalName("KOI8_R");
+        checkHistoricalName("Cp1250");
+        checkHistoricalName("Cp1251");
+        checkHistoricalName("Cp1253");
+        checkHistoricalName("Cp1254");
+        checkHistoricalName("Cp1257");
+
+        checkMappedName("ISO-8859-2", "ISO8859_2");
+        checkMappedName("ISO-8859-4", "ISO8859_4");
+        checkMappedName("ISO-8859-5", "ISO8859_5");
+        checkMappedName("ISO-8859-7", "ISO8859_7");
+        checkMappedName("ISO-8859-9", "ISO8859_9");
+        checkMappedName("ISO-8859-13", "ISO8859_13");
+        checkMappedName("KOI8-R", "KOI8_R");
+        checkMappedName("windows-1250", "Cp1250");
+        checkMappedName("windows-1251","Cp1251");
+        checkMappedName("windows-1253", "Cp1253");
+        checkMappedName("windows-1254", "Cp1254");
+        checkMappedName("windows-1257", "Cp1257");
+
+        checkHistoricalName("EUC_CN");
+        checkHistoricalName("EUC_JP");
+        checkHistoricalName("EUC_JP_LINUX");
+        checkHistoricalName("EUC_KR");
+        checkHistoricalName("EUC_TW");
+        checkHistoricalName("ISO2022CN");
+        checkHistoricalName("ISO2022JP");
+        checkHistoricalName("ISO2022KR");
+        checkHistoricalName("ISO8859_3");
+        checkHistoricalName("ISO8859_6");
+        checkHistoricalName("ISO8859_8");
+        checkHistoricalName("Cp1255");
+        checkHistoricalName("Cp1256");
+        checkHistoricalName("Cp1258");
+        checkHistoricalName("MS936");
+        checkHistoricalName("MS949");
+        checkHistoricalName("MS950");
+        checkHistoricalName("TIS620");
+
+        checkMappedName("EUC-CN", "EUC_CN");
+        checkMappedName("EUC-JP", "EUC_JP");
+        checkMappedName("EUC-JP-LINUX", "EUC_JP_LINUX");
+        checkMappedName("EUC-TW", "EUC_TW");
+        checkMappedName("EUC-KR", "EUC_KR");
+        checkMappedName("ISO-2022-CN", "ISO2022CN");
+        checkMappedName("ISO-2022-JP", "ISO2022JP");
+        checkMappedName("ISO-2022-KR", "ISO2022KR");
+        checkMappedName("ISO-8859-3", "ISO8859_3");
+        checkMappedName("ISO-8859-6", "ISO8859_6");
+        checkMappedName("ISO-8859-8", "ISO8859_8");
+        checkMappedName("windows-1255", "Cp1255");
+        checkMappedName("windows-1256", "Cp1256");
+        checkMappedName("windows-1258", "Cp1258");
+        checkMappedName("windows-936", "GBK");
+        checkMappedName("windows-949", "MS949");
+        checkMappedName("windows-950", "MS950");
+        checkMappedName("x-MS950-HKSCS", "MS950_HKSCS");
+        checkMappedName("x-PCK", "PCK");
+        checkMappedName("Shift_JIS", "SJIS");
+        checkMappedName("x-JISAutoDetect", "JISAutoDetect");
+        checkMappedName("TIS-620", "TIS620");
+        checkMappedName("x-Big5-Solaris", "Big5_Solaris");
+
+        checkHistoricalName("Cp037");
+        checkHistoricalName("Cp1006");
+        checkHistoricalName("Cp1025");
+        checkHistoricalName("Cp1026");
+        checkHistoricalName("Cp1046");
+        checkHistoricalName("Cp1047");
+        checkHistoricalName("Cp1097");
+        checkHistoricalName("Cp1098");
+        checkHistoricalName("Cp1112");
+        checkHistoricalName("Cp1122");
+        checkHistoricalName("Cp1123");
+        checkHistoricalName("Cp1124");
+        checkHistoricalName("Cp1140");
+        checkHistoricalName("Cp1141");
+        checkHistoricalName("Cp1142");
+        checkHistoricalName("Cp1143");
+        checkHistoricalName("Cp1144");
+        checkHistoricalName("Cp1145");
+        checkHistoricalName("Cp1146");
+        checkHistoricalName("Cp1147");
+        checkHistoricalName("Cp1148");
+        checkHistoricalName("Cp1149");
+        checkHistoricalName("Cp1381");
+        checkHistoricalName("Cp1383");
+        checkHistoricalName("Cp273");
+        checkHistoricalName("Cp277");
+        checkHistoricalName("Cp278");
+        checkHistoricalName("Cp280");
+        checkHistoricalName("Cp284");
+        checkHistoricalName("Cp285");
+        checkHistoricalName("Cp297");
+        checkHistoricalName("Cp33722");
+        checkHistoricalName("Cp420");
+        checkHistoricalName("Cp424");
+        checkHistoricalName("Cp437");
+        checkHistoricalName("Cp500");
+        checkHistoricalName("Cp737");
+        checkHistoricalName("Cp775");
+        checkHistoricalName("Cp838");
+        checkHistoricalName("Cp850");
+        checkHistoricalName("Cp852");
+        checkHistoricalName("Cp855");
+        checkHistoricalName("Cp856");
+        checkHistoricalName("Cp857");
+        checkHistoricalName("Cp858");
+        checkHistoricalName("Cp860");
+        checkHistoricalName("Cp861");
+        checkHistoricalName("Cp862");
+        checkHistoricalName("Cp863");
+        checkHistoricalName("Cp864");
+        checkHistoricalName("Cp865");
+        checkHistoricalName("Cp866");
+        checkHistoricalName("Cp868");
+        checkHistoricalName("Cp869");
+        checkHistoricalName("Cp870");
+        checkHistoricalName("Cp871");
+        checkHistoricalName("Cp874");
+        checkHistoricalName("Cp875");
+        checkHistoricalName("Cp918");
+        checkHistoricalName("Cp921");
+        checkHistoricalName("Cp922");
+        checkHistoricalName("Cp933");
+        checkHistoricalName("Cp939");
+        checkHistoricalName("Cp949");
+        checkHistoricalName("Cp964");
+        checkHistoricalName("Cp970");
+
+        checkMappedName("IBM037", "Cp037");
+        checkMappedName("IBM1006", "Cp1006");
+        checkMappedName("IBM1025", "Cp1025");
+        checkMappedName("IBM1026", "Cp1026");
+        checkMappedName("x-IBM1046", "Cp1046");
+        checkMappedName("IBM1047", "Cp1047");
+        checkMappedName("IBM1097", "Cp1097");
+        checkMappedName("IBM1098", "Cp1098");
+        checkMappedName("IBM1112", "Cp1112");
+        checkMappedName("IBM1122", "Cp1122");
+        checkMappedName("IBM1123", "Cp1123");
+        checkMappedName("IBM1124", "Cp1124");
+        checkMappedName("IBM01140", "Cp1140");
+        checkMappedName("IBM01141", "Cp1141");
+        checkMappedName("IBM01142", "Cp1142");
+        checkMappedName("IBM01143", "Cp1143");
+        checkMappedName("IBM01144", "Cp1144");
+        checkMappedName("IBM01145", "Cp1145");
+        checkMappedName("IBM01146", "Cp1146");
+        checkMappedName("IBM01147", "Cp1147");
+        checkMappedName("IBM01148", "Cp1148");
+        checkMappedName("IBM01149", "Cp1149");
+        checkMappedName("IBM1381", "Cp1381");
+        checkMappedName("IBM1383", "Cp1383");
+        checkMappedName("IBM273", "Cp273");
+        checkMappedName("IBM277", "Cp277");
+        checkMappedName("IBM278", "Cp278");
+        checkMappedName("IBM280", "Cp280");
+        checkMappedName("IBM284", "Cp284");
+        checkMappedName("IBM285", "Cp285");
+        checkMappedName("IBM297", "Cp297");
+        checkMappedName("IBM33722", "Cp33722");
+        checkMappedName("IBM420", "Cp420");
+        checkMappedName("IBM424", "Cp424");
+        checkMappedName("IBM437", "Cp437");
+        checkMappedName("IBM500", "Cp500");
+        checkMappedName("IBM737", "Cp737");
+        checkMappedName("IBM775", "Cp775");
+        checkMappedName("IBM838", "Cp838");
+        checkMappedName("IBM850", "Cp850");
+        checkMappedName("IBM852", "Cp852");
+        checkMappedName("IBM855", "Cp855");
+        checkMappedName("IBM856", "Cp856");
+        checkMappedName("IBM857", "Cp857");
+        checkMappedName("IBM00858", "Cp858");
+        checkMappedName("IBM860", "Cp860");
+        checkMappedName("IBM861", "Cp861");
+        checkMappedName("IBM862", "Cp862");
+        checkMappedName("IBM863", "Cp863");
+        checkMappedName("IBM864", "Cp864");
+        checkMappedName("IBM865", "Cp865");
+        checkMappedName("IBM866", "Cp866");
+        checkMappedName("IBM868", "Cp868");
+        checkMappedName("IBM869", "Cp869");
+        checkMappedName("IBM870", "Cp870");
+        checkMappedName("IBM871", "Cp871");
+        checkMappedName("IBM874", "Cp874");
+        checkMappedName("IBM875", "Cp875");
+        checkMappedName("IBM918", "Cp918");
+        checkMappedName("IBM921", "Cp921");
+        checkMappedName("IBM922", "Cp922");
+        checkMappedName("x-IBM930", "Cp930");
+        checkMappedName("IBM933", "Cp933");
+        checkMappedName("x-IBM935", "Cp935");
+        checkMappedName("x-IBM937", "Cp937");
+        checkMappedName("IBM939", "Cp939");
+        checkMappedName("x-IBM942", "Cp942");
+        checkMappedName("x-IBM942C", "Cp942C");
+        checkMappedName("x-IBM943", "Cp943");
+        checkMappedName("x-IBM943C", "Cp943C");
+        checkMappedName("x-IBM948", "Cp948");
+        checkMappedName("IBM949", "Cp949");
+        checkMappedName("x-IBM949C", "Cp949C");
+        checkMappedName("x-IBM950", "Cp950");
+        checkMappedName("IBM964", "Cp964");
+        checkMappedName("IBM970", "Cp970");
+
+        checkHistoricalName("MacArabic");
+        checkHistoricalName("MacCentralEurope");
+        checkHistoricalName("MacCroatian");
+        checkHistoricalName("MacCyrillic");
+        checkHistoricalName("MacDingbat");
+        checkHistoricalName("MacGreek");
+        checkHistoricalName("MacHebrew");
+        checkHistoricalName("MacIceland");
+        checkHistoricalName("MacRoman");
+        checkHistoricalName("MacRomania");
+        checkHistoricalName("MacSymbol");
+        checkHistoricalName("MacThai");
+        checkHistoricalName("MacTurkish");
+        checkHistoricalName("MacUkraine");
+
+        checkMappedName("x-MacArabic", "MacArabic");
+        checkMappedName("x-MacCentralEurope", "MacCentralEurope");
+        checkMappedName("x-MacCroatian", "MacCroatian");
+        checkMappedName("x-MacCyrillic", "MacCyrillic");
+        checkMappedName("x-MacDingbat", "MacDingbat");
+        checkMappedName("x-MacGreek", "MacGreek");
+        checkMappedName("x-MacHebrew", "MacHebrew");
+        checkMappedName("x-MacIceland", "MacIceland");
+        checkMappedName("x-MacRoman", "MacRoman");
+        checkMappedName("x-MacRomania", "MacRomania");
+        checkMappedName("x-MacSymbol", "MacSymbol");
+        checkMappedName("x-MacThai", "MacThai");
+        checkMappedName("x-MacTurkish", "MacTurkish");
+        checkMappedName("x-MacUkraine", "MacUkraine");
+
+        if (failed != 0)
+            throw new Exception("Test Failed: " + failed);
+        else
+            System.out.println("Test Passed!");
+    }
+
+    private static void checkHistoricalName(String name) throws Exception {
+        checkMappedName(name, name);
+    }
+
+    private static void checkMappedName(String alias, String canonical)
+        throws Exception {
+        InputStreamReader reader = new InputStreamReader(System.in, alias);
+        if (!reader.getEncoding().equals(canonical)) {
+            System.out.println("Failed canonical names : mismatch for " + alias
+                               + " - expected " + canonical
+                               + ", got " + reader.getEncoding());
+            failed++;
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/ConvertSingle.java b/jdk/test/sun/nio/cs/ConvertSingle.java
new file mode 100644
index 0000000..3222c18
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ConvertSingle.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4094987
+   @summary Verify that malformed expression exceptions are thrown
+       but no internal errors in certain pathologial cases.
+
+ */
+
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class ConvertSingle {
+
+    public static void main(String args[]) throws Exception {
+        // This conversion is pathologically bad - it is attempting to
+        // read unicode from an ascii encoded string.
+        // The orignal bug: A internal error in ISR results if the
+        // byte counter in ByteToCharUnicode
+        // is not advanced as the input is consumed.
+
+        try{
+            String s = "\n";
+            byte ss[] = null;
+            String sstring = "x";
+            ss = s.getBytes();
+            ByteArrayInputStream BAIS = new ByteArrayInputStream(ss);
+            InputStreamReader ISR = new InputStreamReader(BAIS, "Unicode");
+            BufferedReader BR = new BufferedReader(ISR);
+            sstring = BR.readLine();
+            BR.close();
+            System.out.println(sstring);
+        } catch (MalformedInputException e){
+            // Right error
+            return;
+        } catch (java.lang.InternalError e) {
+            throw new Exception("ByteToCharUnicode is failing incorrectly for "
+                                + " single byte input");
+        }
+
+    }
+
+}
diff --git a/jdk/test/sun/nio/cs/Decode.java b/jdk/test/sun/nio/cs/Decode.java
new file mode 100644
index 0000000..d1ae78d
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Decode.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**/
+
+public class Decode {
+    private static boolean isAscii(char c) {
+        return c < '\u0080';
+    }
+
+    private static boolean isPrintable(char c) {
+        return ('\u0020' < c) && (c < '\u007f');
+    }
+
+    public static void main(String[] args) throws Throwable {
+        if (args.length < 2)
+            throw new Exception("Usage: java Decode CHARSET BYTE [BYTE ...]");
+        String cs = args[0];
+        byte[] bytes = new byte[args.length-1];
+        for (int i = 1; i < args.length; i++) {
+            String arg = args[i];
+            bytes[i-1] =
+                (arg.length() == 1 && isAscii(arg.charAt(0))) ?
+                (byte) arg.charAt(0) :
+                arg.equals("ESC") ? 0x1b :
+                arg.equals("SO")  ? 0x0e :
+                arg.equals("SI")  ? 0x0f :
+                arg.equals("SS2") ? (byte) 0x8e :
+                arg.equals("SS3") ? (byte) 0x8f :
+                arg.matches("0x.*") ? Integer.decode(arg).byteValue() :
+                Integer.decode("0x"+arg).byteValue();
+        }
+        String s = new String(bytes, cs);
+
+        for (int j = 0; j < s.length(); j++) {
+            if (j > 0)
+                System.out.print(' ');
+            char c = s.charAt(j);
+            if (isPrintable(c))
+                System.out.print(c);
+            else if (c == '\u001b') System.out.print("ESC");
+            else
+                System.out.printf("\\u%04x", (int) c);
+        }
+        System.out.print("\n");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/DecoderOverflow.java b/jdk/test/sun/nio/cs/DecoderOverflow.java
new file mode 100644
index 0000000..9ce4d3e
--- /dev/null
+++ b/jdk/test/sun/nio/cs/DecoderOverflow.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 5101128
+   @summary Check behavior of CharsetDecoder.decode when overflow occurs
+   @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class DecoderOverflow {
+    static int failures = 0;
+
+    public static void main(String[] args) throws Exception {
+        for (String csn : Charset.availableCharsets().keySet()) {
+            try {
+                test(csn);
+            } catch (Throwable t) {
+                System.out.println(csn);
+                t.printStackTrace();
+                failures++;
+            }
+        }
+        if (failures > 0)
+            throw new Exception(failures + " charsets failed");
+    }
+
+    static void test(String encoding) throws Exception {
+        String text = "Vote for Duke!";
+        Charset cs = Charset.forName(encoding);
+        if (! cs.canEncode() || ! cs.newEncoder().canEncode('.')) return;
+        ByteBuffer in = ByteBuffer.wrap(text.getBytes(encoding));
+        CharBuffer out = CharBuffer.allocate(text.length()/2);
+        CoderResult result = cs.newDecoder().decode(in, out, true);
+        if (out.hasRemaining() || ! result.isOverflow())
+            throw new Exception
+                ("out.hasRemaining()=" + out.hasRemaining() +
+                 " result.isOverflow()=" + result.isOverflow() +
+                 " in.capacity()=" + in.capacity() +
+                 " encoding=" + encoding);
+    }
+}
diff --git a/jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java b/jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java
new file mode 100644
index 0000000..be35186
--- /dev/null
+++ b/jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4867457
+   @summary Check for correct byte buffer underflow handling in EUC-JP
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EUCJPUnderflowDecodeTest {
+    public static void main(String[] args) throws Exception{
+
+        ByteBuffer bb = ByteBuffer.allocateDirect(255);
+        CharBuffer cc = CharBuffer.allocate(255);
+
+
+        // Test both regular EUC-JP and Linux variant
+
+        String[] charsetNames = { "EUC_JP", "EUC-JP-LINUX" };
+
+        for (int i = 0 ; i < charsetNames.length; i++) {
+            Charset cs = Charset.forName(charsetNames[i]);
+            CharsetDecoder decoder = cs.newDecoder();
+            bb.clear();
+            cc.clear();
+
+            // Fakes a partial 3 byte EUC_JP (JIS-X-0212 range)
+            // encoded character/byte sequence
+            bb.put((byte)0x8f);
+            bb.put((byte)0xa2);
+            bb.flip();
+            // Now decode with endOfInput method param set to
+            // indicate to decoder that there is more encoded
+            // data to follow in a subsequent invocation
+
+            CoderResult result = decoder.decode(bb, cc, false);
+
+            // java.nio.charset.CharsetDecoder spec specifies
+            // that the coder ought to return CoderResult.UNDERFLOW
+            // when insufficient bytes have been supplied to complete
+            // the decoding operation
+
+            if (result != CoderResult.UNDERFLOW) {
+                throw new Exception("test failed - UNDERFLOW not returned");
+            }
+
+            // Repeat the test with the lead byte (minus its pursuing
+            // trail byte) for the EUC-JP 2 byte (JIS208) range
+            decoder.reset();
+            bb.clear();
+            cc.clear();
+            bb.put((byte)0xa1);
+            bb.flip();
+            result = decoder.decode(bb, cc, false);
+            if (result != CoderResult.UNDERFLOW) {
+                throw new Exception("test failed");
+            }
+
+            // finally ensure that a valid JIS208 range EUC-JP
+            // 2 byte value is correctly decoded when it is presented
+            // at the trailing bounds of a ByteBuffer in the case where
+            // charset decoder expects (endOfInput ==false) more
+            //input to follow
+
+            decoder.reset();
+            bb.clear();
+            cc.clear();
+            bb.put((byte)0xa1);
+            bb.put((byte)0xc0);
+            bb.flip();
+
+            result = decoder.decode(bb, cc, false);
+
+            cc.flip();
+
+            if (result != CoderResult.UNDERFLOW && cc.get() != '\uFF3c') {
+                throw new Exception("test failed to decode EUC-JP (0xA1C0)");
+            }
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/EucJpLinux0212.java b/jdk/test/sun/nio/cs/EucJpLinux0212.java
new file mode 100644
index 0000000..d289771
--- /dev/null
+++ b/jdk/test/sun/nio/cs/EucJpLinux0212.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6350021
+ * @summary Consistency checks when input buffer contains JISX0212 characters
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EucJpLinux0212 {
+    private static void equal(CharBuffer b1, CharBuffer b2) {
+        equal(b1.position(), b2.position());
+        equal(b1.limit(), b2.limit());
+        System.out.printf("positions=%d %d%n", b1.position(), b2.position());
+        System.out.printf("limits=%d %d%n", b1.limit(), b2.limit());
+        for (int i = b1.position(); i < b1.limit(); i++)
+            equal((int)b1.get(i), (int)b2.get(i));
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        List<ByteBuffer> bbs = Arrays.asList(
+            ByteBuffer.allocate(10),
+            ByteBuffer.allocateDirect(10));
+        List<CharBuffer> cbs = new ArrayList<CharBuffer>();
+
+        for (ByteBuffer bb : bbs) {
+            bb.put(new byte[]{ (byte)0x8f, 0x01, 0x02,
+                               (byte)0xa1, (byte)0xc0,
+                               0x02, 0x03});
+            bb.flip();
+            CharsetDecoder decoder = Charset.forName("EUC_JP_LINUX").newDecoder();
+            decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
+            CharBuffer cb = decoder.decode(bb);
+            cbs.add(cb);
+        }
+        equal(cbs.get(0), cbs.get(1));
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
diff --git a/jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java b/jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java
new file mode 100644
index 0000000..4ca030a
--- /dev/null
+++ b/jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 5016049
+   @summary ensure euc-jp-linux charset decoder recovery for unmappable input
+ */
+
+import java.io.*;
+
+public class EucJpLinuxDecoderRecoveryTest {
+    public static void main(String[] args) throws Exception {
+        byte[] encoded = {
+                // EUC_JP_LINUX mappable JIS X 0208 range
+                (byte)0xa6, (byte)0xc5,
+                // EUC_JP_LINUX Unmappable (JIS X 0212 range)
+                (byte)0x8f, (byte)0xa2, (byte)0xb7,
+                // EUC_JP_LINUX mappable JIS X 0208 range
+                (byte)0xa6, (byte)0xc7 };
+
+        char[] decodedChars = new char[3];
+        char[] expectedChars =
+                        {
+                        '\u03B5',  // mapped
+                        '\ufffd',  // unmapped
+                        '\u03B7'   // mapped
+                        };
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(encoded);
+        InputStreamReader isr = new InputStreamReader(bais, "EUC_JP_LINUX");
+        int n = 0;   // number of chars decoded
+
+        try {
+            n = isr.read(decodedChars);
+        } catch (Exception ex) {
+            throw new Error("euc-jp-linux decoding broken");
+        }
+
+        // check number of decoded chars is what is expected
+        if (n != expectedChars.length)
+            throw new Error("Unexpected number of chars decoded");
+
+        // Compare actual decoded with expected
+
+        for (int i = 0; i < n; i++) {
+            if (expectedChars[i] != decodedChars[i])
+                throw new Error("euc-jp-linux decoding incorrect");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/EuroConverter.java b/jdk/test/sun/nio/cs/EuroConverter.java
new file mode 100644
index 0000000..6846521
--- /dev/null
+++ b/jdk/test/sun/nio/cs/EuroConverter.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug      4114080
+ * @summary  Make sure the euro converters, which are derived from
+ * existing converters, only differ from their parents at the expected
+ * code point.
+ */
+
+import java.text.*;
+import java.util.*;
+import java.io.*;
+
+/* Author: Alan Liu
+ * 7/14/98
+ */
+public class EuroConverter {
+    public static void main(String args[]) throws Exception {
+        boolean pass = true;
+        char[] map = new char[256]; // map for the encoding
+        byte[] bytes = new byte[1]; // scratch
+        char[] chars = new char[1]; // scratch
+        for (int i=0; i<DATA.length; ) {
+            String euroEnc = DATA[i++];
+            String parentEnc = DATA[i++];
+            System.out.println("Checking encoder " + euroEnc + " against " + parentEnc);
+            String currentEnc = parentEnc;
+
+            try {
+                // Fill map with parent values
+                for (int j=-128; j<128; ++j) {
+                    bytes[0] = (byte)j;
+                    char parentValue = new String(bytes, parentEnc).charAt(0);
+                    // NOTE: 0x25 doesn't round trip on the EBCDIC code pages,
+                    // so we don't check that code point in the sanity check.
+                    if (j != 0x0025) {
+                        chars[0] = parentValue;
+                        int parentRoundTrip = new String(chars).getBytes(parentEnc)[0];
+                        // This is a sanity check -- we aren't really testing the parent
+                        // encoder here.
+                        if (parentRoundTrip != j) {
+                            pass = false;
+                            System.out.println("Error: Encoder " + parentEnc +
+                                           " fails round-trip: " + j +
+                                           " -> \\u" + Integer.toHexString(parentValue) +
+                                           " -> " + parentRoundTrip);
+                        }
+                    }
+                    map[(j+0x100)&0xFF] = parentValue;
+                }
+
+                // Modify map with new expected values.  Each pair has code point, parent value, euro value.
+                // Terminated by null.
+                while (DATA[i] != null) {
+                    int codePoint = Integer.valueOf(DATA[i++], 16).intValue();
+                    char expectedParentValue = DATA[i++].charAt(0);
+                    char expectedEuroValue = DATA[i++].charAt(0);
+                    // This is a sanity check -- we aren't really testing the parent
+                    // encoder here.
+                    if (map[codePoint] != expectedParentValue) {
+                        pass = false;
+                        System.out.println("Error: Encoder " + parentEnc +
+                                           " " + Integer.toHexString(codePoint) + " -> \\u" +
+                                           Integer.toHexString(map[codePoint]) + ", expected \\u" +
+                                           Integer.toHexString(expectedParentValue));
+                    }
+                    // Fill in new expected value
+                    map[codePoint] = expectedEuroValue;
+                }
+                ++i; // Skip over null at end of set
+
+                // Now verify the euro encoder
+                currentEnc = euroEnc;
+                for (int j=-128; j<128; ++j) {
+                    bytes[0] = (byte)j;
+                    char euroValue = new String(bytes, euroEnc).charAt(0);
+                    chars[0] = euroValue;
+                    // NOTE: 0x15 doesn't round trip on the EBCDIC code pages,
+                    // so we don't check that code point in the sanity check.
+                    if (j != 0x0015) {
+                        int euroRoundTrip = new String(chars).getBytes(euroEnc)[0];
+                        if (euroRoundTrip != j) {
+                            pass = false;
+                            System.out.println("Error: Encoder " + euroEnc +
+                                           " fails round-trip at " + j);
+                        }
+                    }
+                    // Compare against the map
+                    if (euroValue != map[(j+0x100)&0xFF]) {
+                        pass = false;
+                        System.out.println("Error: Encoder " + euroEnc +
+                                           " " + Integer.toHexString((j+0x100)&0xFF) + " -> \\u" +
+                                           Integer.toHexString(euroValue) + ", expected \\u" +
+                                           Integer.toHexString(map[(j+0x100)&0xFF]));
+                    }
+                }
+            } catch (UnsupportedEncodingException e) {
+                System.out.println("Unsupported encoding " + currentEnc);
+                pass = false;
+                while (i < DATA.length && DATA[i] != null) ++i;
+                ++i; // Skip over null
+            }
+        }
+        if (!pass) {
+            throw new RuntimeException("Bug 4114080 - Euro encoder test failed");
+        }
+    }
+    static String[] DATA = {
+        // New converter, parent converter, [ code point that changed, parent code point value,
+        // euro code point value ], null
+        // Any number of changed code points may be specified, including zero.
+        "ISO8859_15_FDIS", "ISO8859_1",
+            "A4", "\u00A4", "\u20AC",
+            "A6", "\u00A6", "\u0160",
+            "A8", "\u00A8", "\u0161",
+            "B4", "\u00B4", "\u017D",
+            "B8", "\u00B8", "\u017E",
+            "BC", "\u00BC", "\u0152",
+            "BD", "\u00BD", "\u0153",
+            "BE", "\u00BE", "\u0178",
+            null,
+        // 923 is IBM's name for ISO 8859-15; make sure they're identical
+        "Cp923", "ISO8859_15_FDIS", null,
+        "Cp858", "Cp850", "D5", "\u0131", "\u20AC", null,
+        "Cp1140", "Cp037", "9F", "\u00A4", "\u20AC", null,
+        "Cp1141", "Cp273", "9F", "\u00A4", "\u20AC", null,
+        "Cp1142", "Cp277", "5A", "\u00A4", "\u20AC", null,
+        "Cp1143", "Cp278", "5A", "\u00A4", "\u20AC", null,
+        "Cp1144", "Cp280", "9F", "\u00A4", "\u20AC", null,
+        "Cp1145", "Cp284", "9F", "\u00A4", "\u20AC", null,
+        "Cp1146", "Cp285", "9F", "\u00A4", "\u20AC", null,
+        "Cp1147", "Cp297", "9F", "\u00A4", "\u20AC", null,
+        "Cp1148", "Cp500", "9F", "\u00A4", "\u20AC", null,
+        "Cp1149", "Cp871", "9F", "\u00A4", "\u20AC", null,
+    };
+}
diff --git a/jdk/test/sun/nio/cs/FindASCIICodingBugs.java b/jdk/test/sun/nio/cs/FindASCIICodingBugs.java
new file mode 100644
index 0000000..bc6baae
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindASCIICodingBugs.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6196991
+ * @summary Roundtrip Encoding/Decoding of just one ASCII char
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIICodingBugs {
+    private static int failures = 0;
+
+    private static void check(boolean condition) {
+        if (! condition) {
+            new Error("test failed").printStackTrace();
+            failures++;
+        }
+    }
+
+    private static boolean equals(byte[] ba, ByteBuffer bb) {
+        if (ba.length != bb.limit())
+            return false;
+        for (int i = 0; i < ba.length; i++)
+            if (ba[i] != bb.get(i))
+                return false;
+        return true;
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+
+            // Delete the following lines when these charsets are fixed!
+            if (csn.equals("x-JIS0208"))      continue; // MalformedInput
+            if (csn.equals("JIS_X0212-1990")) continue; // MalformedInput
+
+            if (! cs.canEncode()) continue;
+
+            CharsetEncoder enc = cs.newEncoder();
+            CharsetDecoder dec = cs.newDecoder();
+
+            if (! enc.canEncode('A')) continue;
+
+            System.out.println(csn);
+
+            try {
+                byte[] bytes1 = "A".getBytes(csn);
+                ByteBuffer bb = enc.encode(CharBuffer.wrap(new char[]{'A'}));
+
+                check(equals(bytes1, bb));
+                check(new String(bytes1, csn).equals("A"));
+
+                CharBuffer cb = dec.decode(bb);
+                check(cb.toString().equals("A"));
+            } catch (Throwable t) {
+                t.printStackTrace();
+                failures++;
+            }
+        }
+
+        if (failures > 0)
+            throw new Exception(failures + "tests failed");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java b/jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java
new file mode 100644
index 0000000..de466e8
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6378295
+ * @summary Roundtrip Encoding/Decoding of ASCII chars from 0x00-0x7f
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIIRangeCodingBugs {
+    private static int failures = 0;
+    private static byte[] asciiBytes = new byte[0x80];
+    private static char[] asciiChars = new char[0x80];
+    private static String asciiString;
+
+    private static void check(String csn) throws Exception {
+        System.out.println(csn);
+        if (! Arrays.equals(asciiString.getBytes(csn), asciiBytes)) {
+            System.out.printf("%s -> bytes%n", csn);
+            failures++;
+        }
+        if (! new String(asciiBytes, csn).equals(asciiString)) {
+            System.out.printf("%s -> chars%n", csn);
+            failures++;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (int i = 0; i < 0x80; i++) {
+            asciiBytes[i] = (byte) i;
+            asciiChars[i] = (char) i;
+        }
+        asciiString = new String(asciiChars);
+        Charset ascii = Charset.forName("ASCII");
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+            if (!cs.contains(ascii) ||
+                csn.matches(".*2022.*") ||             //iso2022 family
+                csn.matches("x-windows-5022[0|1]") ||  //windows 2022jp
+                csn.matches(".*UTF-[16|32].*"))        //multi-bytes
+                continue;
+            if (! cs.canEncode()) continue;
+            try {
+                check(csn);
+            } catch (Throwable t) {
+                t.printStackTrace();
+                failures++;
+            }
+        }
+        if (failures > 0)
+            throw new Exception(failures + "tests failed");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/FindCanEncodeBugs.java b/jdk/test/sun/nio/cs/FindCanEncodeBugs.java
new file mode 100644
index 0000000..164d531
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindCanEncodeBugs.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 5066863 5066867 5066874 5066879 5066884 5066887
+   @summary canEncode() false iff encode() throws CharacterCodingException
+   @run main/timeout=1200 FindCanEncodeBugs
+   @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class FindCanEncodeBugs {
+    static boolean encodable1(CharsetEncoder enc, char c) {
+        enc.reset();
+        return enc.canEncode(c);
+    }
+
+    static boolean encodable2(CharsetEncoder enc, char c) {
+        enc.reset();
+        try { enc.encode(CharBuffer.wrap(new char[]{c})); return true; }
+        catch (CharacterCodingException e) { return false; }
+    }
+
+    public static void main(String[] args) throws Exception {
+        int failures = 0;
+
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+
+            if (! cs.canEncode() ||
+                csn.matches("x-COMPOUND_TEXT") ||
+                csn.matches("x-ISO-2022-CN-CNS") || // ISO2022_CN_CNS supports less
+                csn.matches("(x-)?IBM(970).*")) // Broken as of 2004-07
+                continue;
+
+            //System.out.println(csn);
+
+            CharsetEncoder enc = cs.newEncoder();
+
+            for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; i++) {
+                boolean encodable1 = encodable1(enc, (char)i);
+                boolean encodable2 = encodable2(enc, (char)i);
+                if (encodable1 != encodable2) {
+                    int start = i;
+                    int end = i;
+                    for (int j = i;
+                         j <= '\uffff' &&
+                             encodable1(enc, (char)j) == encodable1 &&
+                             encodable2(enc, (char)j) == encodable2;
+                         j++)
+                        end = j;
+                    System.out.printf("charset=%-18s canEncode=%-5b ",
+                                      csn, encodable1);
+                    if (start == end)
+                        System.out.printf("\'\\u%04x\'%n", start);
+                    else
+                        System.out.printf("\'\\u%04x\' - \'\\u%04x\'%n",
+                                          start, end);
+                    i = end;
+                    failures++;
+                }
+            }
+        }
+
+        if (failures > 0)
+            throw new Exception(failures + " failures");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/FindDecoderBugs.java b/jdk/test/sun/nio/cs/FindDecoderBugs.java
new file mode 100644
index 0000000..839908f
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java
@@ -0,0 +1,442 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6380723
+ * @summary Decode many byte sequences in many ways
+ * @run main/timeout=1800 FindDecoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindDecoderBugs {
+
+    static boolean isBroken(String csn) {
+        if (csn.equals("x-COMPOUND_TEXT")) return true;
+        return false;
+    }
+
+    static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+        List<T> list = new ArrayList<T>(c);
+        Collections.sort(list);
+        return list;
+    }
+
+    static class TooManyFailures extends RuntimeException {
+        private static final long serialVersionUID = 0L;
+    }
+
+    static String string(byte[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    static String string(char[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (char c : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("\\u%04x", (int) c));
+        }
+        return sb.toString();
+    }
+
+    static class Reporter {
+        // Some machinery to make sure only a small number of errors
+        // that are "too similar" are reported.
+        static class Counts extends HashMap<String, Long> {
+            private static final long serialVersionUID = -1;
+            long inc(String signature) {
+                Long count = get(signature);
+                if (count == null) count = 0L;
+                put(signature, count+1);
+                return count+1;
+            }
+        }
+
+        final Counts failureCounts = new Counts();
+        final static long maxFailures = 2;
+
+        final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+        final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+        boolean bug(String format, Object... args) {
+            String signature = String.format(format, args);
+            signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+            signature = hideChars.matcher(signature).replaceAll("\\u????");
+            failed++;
+            if (failureCounts.inc(signature) <= maxFailures) {
+                System.out.printf(format, args);
+                System.out.println();
+                return true;
+            }
+            return false;
+        }
+
+        void summarize() {
+            for (String key : sort(failureCounts.keySet()))
+                System.out.printf("-----%n%s%nfailures=%d%n",
+                                  key, failureCounts.get(key));
+        }
+    }
+
+    static final Reporter reporter = new Reporter();
+
+    static class Result {
+        final int limit;
+        final int ipos;
+        final boolean direct;
+        final byte[] ia;
+        final char[] oa;
+        final CoderResult cr;
+
+        Result(ByteBuffer ib, CharBuffer ob, CoderResult cr) {
+            ipos = ib.position();
+            ia = toArray(ib);
+            oa = toArray(ob);
+            direct = ib.isDirect();
+            limit = ob.limit();
+            this.cr = cr;
+        }
+
+        static byte[] toArray(ByteBuffer b) {
+            int pos = b.position();
+            byte[] a = new byte[b.limit()];
+            b.position(0);
+            b.get(a);
+            b.position(pos);
+            return a;
+        }
+
+        static char[] toArray(CharBuffer b) {
+            char[] a = new char[b.position()];
+            b.position(0);
+            b.get(a);
+            return a;
+        }
+
+        static boolean eq(Result x, Result y) {
+            return x == y ||
+                (x != null && y != null &&
+                 (Arrays.equals(x.oa, y.oa) &&
+                  x.ipos == y.ipos &&
+                  x.cr == y.cr));
+        }
+
+        public String toString() {
+            return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+                                 string(ia), ipos, ia.length,
+                                 cr, string(oa), oa.length, limit,
+                                 (direct ? " (direct)" : ""));
+        }
+    }
+
+    // legend: r=regular d=direct In=Input Ou=Output
+    static final int maxBufSize = 20;
+    static final ByteBuffer[] ribs = new ByteBuffer[maxBufSize];
+    static final ByteBuffer[] dibs = new ByteBuffer[maxBufSize];
+
+    static final CharBuffer[] robs = new CharBuffer[maxBufSize];
+    static final CharBuffer[] dobs = new CharBuffer[maxBufSize];
+    static {
+        for (int i = 0; i < maxBufSize; i++) {
+            ribs[i] = ByteBuffer.allocate(i);
+            dibs[i] = ByteBuffer.allocateDirect(i);
+            robs[i] = CharBuffer.allocate(i);
+            dobs[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+        }
+    }
+
+    static class CharsetTester {
+        private final Charset cs;
+        private static final long maxFailures = 5;
+        private long failures = 0;
+        // private static final long maxCharsetFailures = Long.MAX_VALUE;
+        private static final long maxCharsetFailures = 10000L;
+        private final long failed0 = failed;
+
+        CharsetTester(Charset cs) {
+            this.cs = cs;
+        }
+
+        static boolean bug(String format, Object... args) {
+            return reporter.bug(format, args);
+        }
+
+        Result recode(ByteBuffer ib, CharBuffer ob) {
+            try {
+                char canary = '\u4242';
+                ib.clear();     // Prepare to read
+                ob.clear();     // Prepare to write
+                for (int i = 0; i < ob.limit(); i++)
+                    ob.put(i, canary);
+                CharsetDecoder coder = cs.newDecoder();
+                CoderResult cr = coder.decode(ib, ob, false);
+                equal(ib.limit(), ib.capacity());
+                equal(ob.limit(), ob.capacity());
+                Result r = new Result(ib, ob, cr);
+                if (cr.isError())
+                    check(cr.length() > 0);
+                if (cr.isOverflow() && ob.remaining() > 10)
+                    bug("OVERFLOW, but there's lots of room: %s %s",
+                        cs, r);
+//              if (cr.isOverflow() && ib.remaining() == 0)
+//                  bug("OVERFLOW, yet remaining() == 0: %s %s",
+//                      cs, r);
+                if (cr.isError() && ib.remaining() < cr.length())
+                    bug("remaining() < CoderResult.length(): %s %s",
+                        cs, r);
+//              if (ib.position() == 0 && ob.position() > 0)
+//                  reporter. bug("output only if input consumed: %s %s",
+//                                cs, r);
+                // Should we warn if cr.isUnmappable() ??
+                CoderResult cr2 = coder.decode(ib, ob, false);
+                if (ib.position() != r.ipos ||
+                    ob.position() != r.oa.length ||
+                    cr != cr2)
+                    bug("Coding operation not idempotent: %s%n    %s%n    %s",
+                        cs, r, new Result(ib, ob, cr2));
+                if (ob.position() < ob.limit() &&
+                    ob.get(ob.position()) != canary)
+                    bug("Buffer overrun: %s %s %s",
+                        cs, r, ob.get(ob.position()));
+                return r;
+            } catch (Throwable t) {
+                if (bug("Unexpected exception: %s %s %s",
+                        cs, t.getClass().getSimpleName(),
+                        new Result(ib, ob, null)))
+                    t.printStackTrace();
+                return null;
+            }
+        }
+
+        Result recode2(byte[] ia, int n) {
+            int len = ia.length;
+            ByteBuffer rib = ByteBuffer.wrap(ia);
+            ByteBuffer dib = dibs[len];
+            dib.clear(); dib.put(ia); dib.clear();
+            CharBuffer rob = robs[n];
+            CharBuffer dob = dobs[n];
+            equal(rob.limit(), n);
+            equal(dob.limit(), n);
+            check(dib.isDirect());
+            check(dob.isDirect());
+            Result r1 = recode(rib, rob);
+            Result r2 = recode(dib, dob);
+            if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+                bug("Results differ for direct buffers: %s%n    %s%n    %s",
+                    cs, r1, r2);
+            return r1;
+        }
+
+        Result test(byte[] ia) {
+            if (failed - failed0 >= maxCharsetFailures)
+                throw new TooManyFailures();
+
+            Result roomy = recode2(ia, maxBufSize - 1);
+            if (roomy == null) return roomy;
+            int olen = roomy.oa.length;
+            if (olen > 0) {
+                if (roomy.ipos == roomy.ia.length) {
+                    Result perfectFit = recode2(ia, olen);
+                    if (! Result.eq(roomy, perfectFit))
+                        bug("Results differ: %s%n    %s%n    %s",
+                            cs, roomy, perfectFit);
+                }
+                for (int i = 0; i < olen; i++) {
+                    Result claustrophobic = recode2(ia, i);
+                    if (claustrophobic == null) return roomy;
+                    if (roomy.cr.isUnderflow() &&
+                        ! claustrophobic.cr.isOverflow())
+                        bug("Expected OVERFLOW: %s%n    %s%n    %s",
+                            cs, roomy, claustrophobic);
+                }
+            }
+            return roomy;
+        }
+
+        void testExhaustively(byte[] prefix, int n) {
+            int len = prefix.length;
+            byte[] ia = Arrays.copyOf(prefix, len + 1);
+            for (int i = 0; i < 0x100; i++) {
+                ia[len] = (byte) i;
+                if (n == 1)
+                    test(ia);
+                else
+                    testExhaustively(ia, n - 1);
+            }
+        }
+
+        void testRandomly(byte[] prefix, int n) {
+            int len = prefix.length;
+            byte[] ia = Arrays.copyOf(prefix, len + n);
+            for (int i = 0; i < 10000; i++) {
+                for (int j = 0; j < n; j++)
+                    ia[len + j] = randomByte();
+                test(ia);
+            }
+        }
+
+        void testPrefix(byte[] prefix) {
+            if (prefix.length > 0)
+                System.out.printf("Testing prefix %s%n", string(prefix));
+
+            test(prefix);
+
+            testExhaustively(prefix, 1);
+            testExhaustively(prefix, 2);
+            // Can you spare a week of CPU time?
+            // testExhaustively(cs, tester, prefix, 3);
+
+            testRandomly(prefix, 3);
+            testRandomly(prefix, 4);
+        }
+    }
+
+    private final static Random rnd = new Random();
+    private static byte randomByte() {
+        return (byte) rnd.nextInt(0x100);
+    }
+    private static byte[] randomBytes(int len) {
+        byte[] a = new byte[len];
+        for (int i = 0; i < len; i++)
+            a[i] = randomByte();
+        return a;
+    }
+
+    private static final byte SS2 = (byte) 0x8e;
+    private static final byte SS3 = (byte) 0x8f;
+    private static final byte ESC = (byte) 0x1b;
+    private static final byte SO  = (byte) 0x0e;
+    private static final byte SI  = (byte) 0x0f;
+
+    private final static byte[][] stateChangers = {
+        {SS2}, {SS3}, {SO}, {SI}
+    };
+
+    private final static byte[][]escapeSequences = {
+        {ESC, '(', 'B'},
+        {ESC, '(', 'I'},
+        {ESC, '(', 'J'},
+        {ESC, '$', '@'},
+        {ESC, '$', 'A'},
+        {ESC, '$', ')', 'A'},
+        {ESC, '$', ')', 'C'},
+        {ESC, '$', ')', 'G'},
+        {ESC, '$', '*', 'H'},
+        {ESC, '$', '+', 'I'},
+        {ESC, '$', 'B'},
+        {ESC, 'N'},
+        {ESC, 'O'},
+        {ESC, '$', '(', 'D'},
+    };
+
+    private static boolean isStateChanger(Charset cs, byte[] ia) {
+        Result r = new CharsetTester(cs).recode2(ia, 9);
+        return r == null ? false :
+            (r.cr.isUnderflow() &&
+             r.ipos == ia.length &&
+             r.oa.length == 0);
+    }
+
+    private final static byte[][] incompletePrefixes = {
+        {ESC},
+        {ESC, '('},
+        {ESC, '$'},
+        {ESC, '$', '(',},
+    };
+
+    private static boolean isIncompletePrefix(Charset cs, byte[] ia) {
+        Result r = new CharsetTester(cs).recode2(ia, 9);
+        return r == null ? false :
+            (r.cr.isUnderflow() &&
+             r.ipos == 0 &&
+             r.oa.length == 0);
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        final String csn = cs.name();
+
+        if (isBroken(csn)) {
+            System.out.printf("Skipping possibly broken charset %s%n", csn);
+            return;
+        }
+        System.out.println(csn);
+        CharsetTester tester = new CharsetTester(cs);
+
+        tester.testPrefix(new byte[0]);
+
+        if (! csn.matches("(?:x-)?(?:UTF|JIS(?:_X)?0).*")) {
+            for (byte[] prefix : stateChangers)
+                if (isStateChanger(cs, prefix))
+                    tester.testPrefix(prefix);
+
+            for (byte[] prefix : incompletePrefixes)
+                if (isIncompletePrefix(cs, prefix))
+                    tester.testPrefix(prefix);
+
+            if (isIncompletePrefix(cs, new byte[] {ESC}))
+                for (byte[] prefix : escapeSequences)
+                    if (isStateChanger(cs, prefix))
+                        tester.testPrefix(prefix);
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : sort(Charset.availableCharsets().values())) {
+            try {
+                testCharset(cs);
+            } catch (TooManyFailures e) {
+                System.out.printf("Too many failures for %s%n", cs);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        }
+        reporter.summarize();
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile long passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
diff --git a/jdk/test/sun/nio/cs/FindEncoderBugs.java b/jdk/test/sun/nio/cs/FindEncoderBugs.java
new file mode 100644
index 0000000..0f4c406
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java
@@ -0,0 +1,529 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6233345 6381699 6381702 6381705 6381706
+ * @summary Encode many char sequences in many ways
+ * @run main/timeout=1200 FindEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindEncoderBugs {
+
+    static boolean isBroken(String csn) {
+        if (csn.equals("x-COMPOUND_TEXT")) return true;
+        if (csn.equals("x-IBM834")) return true;  // stateful korean
+        if (csn.equals("x-IBM933")) return true;  // stateful korean
+        if (csn.equals("x-IBM970")) return true;  // stateful korean
+        if (csn.equals("x-IBM949")) return true;  // stateful korean
+        if (csn.equals("x-IBM949C")) return true; // stateful korean
+        return false;
+    }
+
+    static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+        List<T> list = new ArrayList<T>(c);
+        Collections.sort(list);
+        return list;
+    }
+
+    static class TooManyFailures extends RuntimeException {
+        private static final long serialVersionUID = 0L;
+    }
+
+    static String string(byte[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    static String string(char[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (char c : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("\\u%04x", (int) c));
+        }
+        return sb.toString();
+    }
+
+    static class Reporter {
+        // Some machinery to make sure only a small number of errors
+        // that are "too similar" are reported.
+        static class Counts extends HashMap<String, Long> {
+            private static final long serialVersionUID = -1;
+            long inc(String signature) {
+                Long count = get(signature);
+                if (count == null) count = 0L;
+                put(signature, count+1);
+                return count+1;
+            }
+        }
+
+        final Counts failureCounts = new Counts();
+        final static long maxFailures = 2;
+
+        final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+        final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+        boolean bug(String format, Object... args) {
+            String signature = String.format(format, args);
+            //      signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+            //      signature = hideChars.matcher(signature).replaceAll("\\u????");
+            failed++;
+            if (failureCounts.inc(signature) <= maxFailures) {
+                System.out.printf(format, args);
+                System.out.println();
+                return true;
+            }
+            return false;
+        }
+
+        void summarize() {
+            for (String key : sort(failureCounts.keySet()))
+                System.out.printf("-----%n%s%nfailures=%d%n",
+                                  key, failureCounts.get(key));
+        }
+    }
+
+    static final Reporter reporter = new Reporter();
+
+    static class Result {
+        final int limit;
+        final int ipos;
+        final boolean direct;
+        final char[] ia;
+        final byte[] oa;
+        final CoderResult cr;
+
+        private static byte[] toByteArray(ByteBuffer bb) {
+            byte[] bytes = new byte[bb.position()];
+            for (int i = 0; i < bytes.length; i++)
+                bytes[i] = bb.get(i);
+            return bytes;
+        }
+
+        Result(CharBuffer ib, ByteBuffer ob, CoderResult cr) {
+            ipos = ib.position();
+            ia = toArray(ib);
+            oa = toArray(ob);
+            direct = ib.isDirect();
+            limit = ob.limit();
+            this.cr = cr;
+        }
+
+        static char[] toArray(CharBuffer b) {
+            int pos = b.position();
+            char[] a = new char[b.limit()];
+            b.position(0);
+            b.get(a);
+            b.position(pos);
+            return a;
+        }
+
+        static byte[] toArray(ByteBuffer b) {
+            byte[] a = new byte[b.position()];
+            b.position(0);
+            b.get(a);
+            return a;
+        }
+
+        static boolean eq(Result x, Result y) {
+            return x == y ||
+                (x != null && y != null &&
+                 (Arrays.equals(x.oa, y.oa) &&
+                  x.ipos == y.ipos &&
+                  x.cr == y.cr));
+        }
+
+        public String toString() {
+            return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+                                 string(ia), ipos, ia.length,
+                                 cr, string(oa), oa.length, limit,
+                                 (direct ? " (direct)" : ""));
+        }
+    }
+
+    static class CharsetTester {
+        private final Charset cs;
+        private final boolean hasBom;
+        private static final int maxFailures = 5;
+        private int failures = 0;
+        // private static final long maxCharsetFailures = Long.MAX_VALUE;
+        private static final long maxCharsetFailures = 10000L;
+        private final long failed0 = failed;
+
+        // legend: r=regular d=direct In=Input Ou=Output
+        static final int maxBufSize = 20;
+        static final CharBuffer[] rInBuffers = new CharBuffer[maxBufSize];
+        static final CharBuffer[] dInBuffers = new CharBuffer[maxBufSize];
+
+        static final ByteBuffer[] rOuBuffers = new ByteBuffer[maxBufSize];
+        static final ByteBuffer[] dOuBuffers = new ByteBuffer[maxBufSize];
+        static {
+            for (int i = 0; i < maxBufSize; i++) {
+                rInBuffers[i] = CharBuffer.allocate(i);
+                dInBuffers[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+                rOuBuffers[i] = ByteBuffer.allocate(i);
+                dOuBuffers[i] = ByteBuffer.allocateDirect(i);
+            }
+        }
+
+        CharsetTester(Charset cs) {
+            this.cs = cs;
+            this.hasBom =
+                cs.name().matches(".*BOM.*") ||
+                cs.name().equals("UTF-16");
+        }
+
+        static boolean bug(String format, Object... args) {
+            return reporter.bug(format, args);
+        }
+
+        static boolean hasBom(byte[] a) {
+            switch (a.length) {
+            case 2: case 4:
+                int sum = 0;
+                for (byte x : a)
+                    sum += x;
+                return sum == (byte) 0xfe + (byte) 0xff;
+            default: return false;
+            }
+        }
+
+        void testSurrogates() {
+            int failures = 0;
+            for (int i = 0; i < 10; i++) {
+                Result r = test(new char[] { randomHighSurrogate() });
+                if (r == null) break;
+                if (! (r.cr.isUnderflow() &&
+                       r.ipos == 0))
+                    bug("Lone high surrogate not UNDERFLOW: %s %s",
+                        cs, r);
+            }
+            for (int i = 0; i < 10; i++) {
+                Result r = test(new char[] { randomLowSurrogate() });
+                if (r == null) break;
+                if (! (r.cr.isMalformed() && r.cr.length() == 1))
+                    bug("Lone low surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+            }
+            char[] chars = new char[2];
+            for (int i = 0; i < 10; i++) {
+                chars[0] = randomLowSurrogate(); // Always illegal
+                chars[1] = randomChar();
+                Result r = test(chars);
+                if (r == null) break;
+                if (! (r.cr.isMalformed() &&
+                       r.cr.length() == 1 &&
+                       (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+                    if (failures++ > 5) return;
+                    bug("Unpaired low surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+                }
+            }
+            for (int i = 0; i < 10; i++) {
+                chars[0] = randomHighSurrogate();
+                do {
+                    chars[1] = randomChar();
+                } while (Character.isLowSurrogate(chars[1]));
+                Result r = test(chars);
+                if (r == null) break;
+                if (! (r.cr.isMalformed() &&
+                       r.cr.length() == 1 &&
+                       (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+                    if (failures++ > 5) return;
+                    bug("Unpaired high surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+                }
+            }
+            for (int i = 0; i < 1000; i++) {
+                chars[0] = randomHighSurrogate();
+                chars[1] = randomLowSurrogate();
+                Result r = test(chars);
+                if (r == null) break;
+                if (! ((r.cr.isUnmappable() &&
+                        r.cr.length() == 2 &&
+                        r.oa.length == 0)
+                       ||
+                       (r.cr.isUnderflow() &&
+                        r.oa.length > 0 &&
+                        r.ipos == 2))) {
+                    if (failures++ > 5) return;
+                    bug("Legal supplementary character bug: %s %s",
+                        cs, r);
+                }
+            }
+        }
+
+//              if (! (r.cr.isMalformed() &&
+//                     r.cr.length() == 1 &&
+//                     (rob.position() == 0 || hasBom(rob)))) {
+//                  if (failures++ > 5) return;
+//                  bug("Unpaired surrogate not malformed: %s %s",
+//                               cs, r);
+//              }
+//          }
+
+//                  dib.clear(); dib.put(chars); dib.flip();
+//                  rib.position(0);
+//                  rob.clear(); rob.limit(lim);
+//                  for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+//                      Result r = recode(ib, rob);
+//                      if (! (r.cr.isMalformed() &&
+//                             r.cr.length() == 1 &&
+//                             (rob.position() == 0 || hasBom(rob)))) {
+//                          if (failures++ > 5) return;
+//                          bug("Unpaired surrogate not malformed: %s %s",
+//                                       cs, r);
+//                      }
+//                  }
+//                  //}
+//              for (int i = 0; i < 10000; i++) {
+//                  chars[0] = randomHighSurrogate();
+//                  chars[1] = randomLowSurrogate();
+//                  dib.clear(); dib.put(chars); dib.flip();
+//                  rib.position(0);
+//                  rob.clear(); rob.limit(lim);
+//                  for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+//                      Result r = recode(ib, rob);
+//                      if (! ((r.cr.isUnmappable() &&
+//                              r.cr.length() == 2 &&
+//                              rob.position() == 0)
+//                             ||
+//                             (r.cr.isUnderflow() &&
+//                              rob.position() > 0 &&
+//                              ib.position() == 2))) {
+//                          if (failures++ > 5) return;
+//                          bug("Legal supplementary character bug: %s %s",
+//                                       cs, r);
+//                      }
+//                  }
+//              }
+//          }
+//      }
+
+        Result recode(CharBuffer ib, ByteBuffer ob) {
+            try {
+                byte canary = 22;
+                ib.clear();     // Prepare to read
+                ob.clear();     // Prepare to write
+                for (int i = 0; i < ob.limit(); i++)
+                    ob.put(i, canary);
+                CharsetEncoder coder = cs.newEncoder();
+                CoderResult cr = coder.encode(ib, ob, false);
+                equal(ib.limit(), ib.capacity());
+                equal(ob.limit(), ob.capacity());
+                Result r = new Result(ib, ob, cr);
+                if (cr.isError())
+                    check(cr.length() > 0);
+                if (cr.isOverflow() && ob.remaining() > 10)
+                    bug("OVERFLOW, but there's lots of room: %s %s",
+                        cs, r);
+//              if (cr.isOverflow() && ib.remaining() == 0 && ! hasBom)
+//                  bug("OVERFLOW, yet remaining() == 0: %s %s",
+//                      cs, r);
+                if (cr.isError() && ib.remaining() < cr.length())
+                    bug("remaining() < CoderResult.length(): %s %s",
+                        cs, r);
+//              if (ib.position() == 0
+//                  && ob.position() > 0
+//                  && ! hasBom(r.oa))
+//                  bug("output only if input consumed: %s %s",
+//                       cs, r);
+                CoderResult cr2 = coder.encode(ib, ob, false);
+                if (ib.position() != r.ipos ||
+                    ob.position() != r.oa.length ||
+                    cr != cr2)
+                    bug("Coding operation not idempotent: %s%n    %s%n    %s",
+                        cs, r, new Result(ib, ob, cr2));
+                if (ob.position() < ob.limit() &&
+                    ob.get(ob.position()) != canary)
+                    bug("Buffer overrun: %s %s %s",
+                        cs, r, ob.get(ob.position()));
+                return r;
+            } catch (Throwable t) {
+                if (bug("Unexpected exception: %s %s %s",
+                        cs, t.getClass().getSimpleName(),
+                        new Result(ib, ob, null)))
+                    t.printStackTrace();
+                return null;
+            }
+        }
+
+        Result recode2(char[] ia, int n) {
+            int len = ia.length;
+            CharBuffer rib = CharBuffer.wrap(ia);
+            CharBuffer dib = dInBuffers[len];
+            dib.clear(); dib.put(ia); dib.clear();
+            ByteBuffer rob = rOuBuffers[n];
+            ByteBuffer dob = dOuBuffers[n];
+            equal(rob.limit(), n);
+            equal(dob.limit(), n);
+            check(dib.isDirect());
+            check(dob.isDirect());
+            Result r1 = recode(rib, rob);
+            Result r2 = recode(dib, dob);
+            if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+                bug("Results differ for direct buffers: %s%n    %s%n    %s",
+                    cs, r1, r2);
+            return r1;
+        }
+
+        Result test(char[] ia) {
+            if (failed - failed0 >= maxCharsetFailures)
+                throw new TooManyFailures();
+
+            Result roomy = recode2(ia, maxBufSize - 1);
+            if (roomy == null) return roomy;
+            int olen = roomy.oa.length;
+            if (olen > 0) {
+                if (roomy.ipos == roomy.ia.length) {
+                    Result perfectFit = recode2(ia, olen);
+                    if (! Result.eq(roomy, perfectFit))
+                        bug("Results differ: %s%n    %s%n    %s",
+                            cs, roomy, perfectFit);
+                }
+                for (int i = 0; i < olen; i++) {
+                    Result claustrophobic = recode2(ia, i);
+                    if (claustrophobic == null) return roomy;
+                    if (roomy.cr.isUnderflow() &&
+                        ! claustrophobic.cr.isOverflow())
+                        bug("Expected OVERFLOW: %s%n    %s%n    %s",
+                            cs, roomy, claustrophobic);
+                }
+            }
+            return roomy;
+        }
+
+        void testExhaustively(char[] prefix, int n) {
+            int len = prefix.length;
+            char[] ia = Arrays.copyOf(prefix, len + 1);
+            for (int i = 0; i < 0x10000; i++) {
+                ia[len] = (char) i;
+                if (n == 1)
+                    test(ia);
+                else
+                    testExhaustively(ia, n - 1);
+            }
+        }
+
+        void testRandomly(char[] prefix, int n) {
+            int len = prefix.length;
+            char[] ia = Arrays.copyOf(prefix, len + n);
+            for (int i = 0; i < 10000; i++) {
+                for (int j = 0; j < n; j++)
+                    ia[len + j] = randomChar();
+                test(ia);
+            }
+        }
+
+        void testPrefix(char[] prefix) {
+            if (prefix.length > 0)
+                System.out.printf("Testing prefix %s%n", string(prefix));
+
+            test(prefix);
+
+            testExhaustively(prefix, 1);
+            // Can you spare a year of CPU time?
+            //testExhaustively(prefix, 2);
+
+            testRandomly(prefix, 2);
+            testRandomly(prefix, 3);
+        }
+    }
+
+    private final static Random rnd = new Random();
+    private static char randomChar() {
+        return (char) rnd.nextInt(Character.MAX_VALUE);
+    }
+    private static char randomHighSurrogate() {
+        return (char) (Character.MIN_HIGH_SURROGATE + rnd.nextInt(1024));
+    }
+    private static char randomLowSurrogate() {
+        return (char) (Character.MIN_LOW_SURROGATE + rnd.nextInt(1024));
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        if (! cs.canEncode())
+            return;
+
+        final String csn = cs.name();
+
+        if (isBroken(csn)) {
+            System.out.printf("Skipping possibly broken charset %s%n", csn);
+            return;
+        }
+        System.out.println(csn);
+
+        CharsetTester tester = new CharsetTester(cs);
+
+        tester.testSurrogates();
+
+        tester.testPrefix(new char[] {});
+
+        if (csn.equals("x-ISCII91")) {
+            System.out.println("More ISCII testing...");
+            new CharsetTester(cs).testPrefix(new char[]{'\u094d'}); // Halant
+            new CharsetTester(cs).testPrefix(new char[]{'\u093c'}); // Nukta
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : sort(Charset.availableCharsets().values())) {
+            try {
+                testCharset(cs);
+            } catch (TooManyFailures e) {
+                System.out.printf("Too many failures for %s%n", cs);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        }
+        reporter.summarize();
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile long passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
+
diff --git a/jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java b/jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java
new file mode 100644
index 0000000..ba902c5
--- /dev/null
+++ b/jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 5058133 6233345 6381699 6381702 6381705 6381706
+ * @summary Check that all one-char sequences can be encoded by all charsets
+ * @run main/timeout=1200 FindOneCharEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindOneCharEncoderBugs {
+    final static String[] brokenCharsets = {
+        // Delete the following lines when these charsets are fixed!
+        "x-IBM970",
+        "x-COMPOUND_TEXT", // Direct buffers not supported
+    };
+
+    private static boolean equals(byte[] ba, ByteBuffer bb) {
+        if (ba.length != bb.limit())
+            return false;
+        for (int i = 0; i < ba.length; i++)
+            if (ba[i] != bb.get(i))
+                return false;
+        return true;
+    }
+
+    private static String toString(byte[] bytes) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", (int)b));
+        }
+        return sb.toString();
+    }
+
+    private static String toString(ByteBuffer bb) {
+        final StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < bb.limit(); i++) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", (int)bb.get(i)));
+        }
+        return sb.toString();
+    }
+
+    private static ByteBuffer convert(Charset cs, char c, CharBuffer cb) throws Throwable {
+        cb.clear(); cb.put(c); cb.flip();
+        return cs.newEncoder()
+            .onUnmappableCharacter(CodingErrorAction.REPLACE)
+            .onMalformedInput(CodingErrorAction.REPLACE)
+            .encode(cb);
+    }
+
+    /** Returns a direct CharBuffer with the same capacity as ordinary CharBuffer ocb */
+    private static CharBuffer directCharBuffer(CharBuffer ocb) {
+        final CharBuffer dcb =
+            ByteBuffer.allocateDirect(ocb.capacity() * Character.SIZE / Byte.SIZE)
+            .asCharBuffer();
+        check(! ocb.isDirect());
+        check(  dcb.isDirect());
+        equal(ocb.capacity(), dcb.capacity());
+        return dcb;
+    }
+
+    private static void testChar(byte[] expected, CharBuffer cb, Charset cs, char c) {
+        try {
+            final ByteBuffer bb = convert(cs, c, cb);
+            if (! equals(expected, bb))
+                fail("bytes differ charset=%s direct=%s char=\\u%04x%n%s%n%s",
+                     cs, cb.isDirect(), (int)c,
+                     toString(expected), toString(bb));
+        } catch (Throwable t) {
+            System.out.printf("Unexpected exception charset=%s direct=%s char=\\u%04x%n",
+                              cs, cb.isDirect(), (int)c);
+            unexpected(t);
+            failed++;
+        }
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        if (! cs.canEncode())
+            return;
+
+        final String csn = cs.name();
+
+        for (String n : brokenCharsets)
+            if (csn.equals(n)) {
+                System.out.printf("Skipping possibly broken charset %s%n", csn);
+                return;
+            }
+        System.out.println(csn);
+
+        final char[] theChar = new char[1];
+        final CharBuffer ocb = CharBuffer.allocate(1);
+        final CharBuffer dcb = directCharBuffer(ocb);
+        final int maxFailuresPerCharset = 5;
+        final int failed0 = failed;
+
+        for (char c = '\u0000';
+             (c+1 != 0x10000) && (failed - failed0 < maxFailuresPerCharset);
+             c++) {
+            theChar[0] = c;
+            byte[] bytes = new String(theChar).getBytes(csn);
+            if (bytes.length == 0)
+                fail("Empty output?! charset=%s char=\\u%04x", cs, (int)c);
+            testChar(bytes, ocb, cs, c);
+            testChar(bytes, dcb, cs, c);
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : Charset.availableCharsets().values()) {
+            try { testCharset(cs); }
+            catch (Throwable t) { unexpected(t); }
+        }
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+    private static abstract class Fun {abstract void f() throws Throwable;}
+    static void THROWS(Class<? extends Throwable> k, Fun... fs) {
+        for (Fun f : fs)
+            try { f.f(); fail("Expected " + k.getName() + " not thrown"); }
+            catch (Throwable t) {
+                if (k.isAssignableFrom(t.getClass())) pass();
+                else unexpected(t);}}
+    private static abstract class CheckedThread extends Thread {
+        abstract void realRun() throws Throwable;
+        public void run() {
+            try {realRun();} catch (Throwable t) {unexpected(t);}}}
+}
diff --git a/jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java b/jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java
new file mode 100644
index 0000000..629ef1e
--- /dev/null
+++ b/jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4715330
+   @summary Check MS932/windows-31j encoding (char->byte) for halfwidth katakana chars
+ */
+
+/*
+ * Tests encodeability of the Unicode defined Halfwidth Katakana
+ * characters using the MS932/windows-31j encoder
+ */
+
+public class HWKatakanaMS932EncodeTest {
+   public static void main(String[] args) throws Exception {
+
+        char[] testChars = new char[1];
+        byte[] testBytes = new byte[1];
+        int offset = 0;
+        String encoding = "windows-31j";
+
+        // Halfwidth Katakana chars run from U+FF61 --> U+FF9F
+        // and their native equivalents in Code page 932 run
+        // sequentially from 0xa1 --> 0xdf
+
+        for (int lsByte = 0x61 ; lsByte <= 0x9F; lsByte++, offset++) {
+            testChars[0] = (char) (lsByte | 0xFF00);
+            String s = new String(testChars);
+            testBytes = s.getBytes(encoding);
+            if ( testBytes[0] != (byte)(0xa1 + offset))
+                throw new Exception("failed Test");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/ISCIITest.java b/jdk/test/sun/nio/cs/ISCIITest.java
new file mode 100644
index 0000000..48235ce
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ISCIITest.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4328178
+   @summary Performs baseline and regression test on the ISCII91 charset
+ */
+
+import java.io.*;
+
+public class ISCIITest {
+
+    private static void failureReport() {
+        System.err.println ("Failed ISCII91 Regression Test");
+    }
+
+    private static void mapEquiv(int start,
+                                 int end,
+                                 String testName)
+    throws Exception
+    {
+        byte[] singleByte = new byte[1];
+        byte[] encoded = new byte[1];
+
+        for (int i = start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            try {
+                String unicodeStr =
+                        new String (singleByte,"ISCII91");
+
+                if (i != (int)unicodeStr.charAt(0)) {
+                    System.err.println ("FAILED ISCII91 Regression test"
+                                        + "input byte is " + i );
+                    throw new Exception("");
+                }
+                encoded = unicodeStr.getBytes("ISCII91");
+
+                if (encoded[0] != singleByte[0]) {
+                   System.err.println("Encoding error " + testName);
+                   throw new Exception("Failed ISCII91 Regression test");
+                }
+
+            } catch (UnsupportedEncodingException e) {
+                failureReport();
+            }
+        }
+        return;
+    }
+
+    private static void checkUnmapped(int start,
+                                      int end,
+                                      String testName)
+    throws Exception {
+
+        byte[] singleByte = new byte[1];
+
+        for (int i = start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            try {
+                String unicodeStr = new String (singleByte, "ISCII91");
+
+                if (unicodeStr.charAt(0) != '\uFFFD') {
+                    System.err.println("FAILED " + testName +
+                                        "input byte is " + i );
+                    throw new Exception ("Failed ISCII91 regression test");
+                }
+            } catch (UnsupportedEncodingException e) {
+                System.err.println("Unsupported character encoding");
+            }
+        }
+        return;
+    }
+
+    /*
+     *
+     */
+    private static void checkRange(int start, int end,
+                                   char[] expectChars,
+                                   String testName)
+                                   throws Exception {
+        byte[] singleByte = new byte[1];
+        byte[] encoded = new byte[1];
+        int lookupOffset = 0;
+
+        for (int i=start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            String unicodeStr = new String (singleByte, "ISCII91");
+            if (unicodeStr.charAt(0) != expectChars[lookupOffset++]) {
+                throw new Exception ("Failed ISCII91 Regression Test");
+            }
+            encoded = unicodeStr.getBytes("ISCII");
+        }
+        return;
+    }
+
+    /*
+     * Tests the ISCII91 Indic character encoding
+     * as per IS 13194:1991 Bureau of Indian Standards.
+     */
+
+    private static void test () throws Exception {
+
+        try {
+
+
+            // ISCII91 is an 8-byte encoding which retains the ASCII
+            // mappings in the lower half.
+
+            mapEquiv(0, 0x7f, "7 bit ASCII range");
+
+            // Checks a range of characters which are unmappable according
+            // to the standards.
+
+            checkUnmapped(0x81, 0x9f, "UNMAPPED");
+
+            // Vowel Modifier chars can be used to modify the vowel
+            // sound of the preceding consonant, vowel or matra character.
+
+            byte[] testByte = new byte[1];
+            char[] vowelModChars = {
+                '\u0901', // Vowel modifier Chandrabindu
+                '\u0902', // Vowel modifier Anuswar
+                '\u0903'  // Vowel modifier Visarg
+            };
+
+            checkRange(0xa1, 0xa3, vowelModChars, "INDIC VOWEL MODIFIER CHARS");
+
+            char[] expectChars = {
+                '\u0905', // a4 -- Vowel A
+                '\u0906', // a5 -- Vowel AA
+                '\u0907', // a6 -- Vowel I
+                '\u0908', // a7 -- Vowel II
+                '\u0909', // a8 -- Vowel U
+                '\u090a', // a9 -- Vowel UU
+                '\u090b', // aa -- Vowel RI
+                '\u090e', // ab -- Vowel E ( Southern Scripts )
+                '\u090f', // ac -- Vowel EY
+                '\u0910', // ad -- Vowel AI
+                '\u090d', // ae -- Vowel AYE ( Devanagari Script )
+                '\u0912', // af -- Vowel O ( Southern Scripts )
+                '\u0913', // b0 -- Vowel OW
+                '\u0914', // b1 -- Vowel AU
+                '\u0911', // b2 -- Vowel AWE ( Devanagari Script )
+            };
+
+            checkRange(0xa4, 0xb2, expectChars, "INDIC VOWELS");
+
+            char[] expectConsChars =
+            {
+                '\u0915', // b3 -- Consonant KA
+                '\u0916', // b4 -- Consonant KHA
+                '\u0917', // b5 -- Consonant GA
+                '\u0918', // b6 -- Consonant GHA
+                '\u0919', // b7 -- Consonant NGA
+                '\u091a', // b8 -- Consonant CHA
+                '\u091b', // b9 -- Consonant CHHA
+                '\u091c', // ba -- Consonant JA
+                '\u091d', // bb -- Consonant JHA
+                '\u091e', // bc -- Consonant JNA
+                '\u091f', // bd -- Consonant Hard TA
+                '\u0920', // be -- Consonant Hard THA
+                '\u0921', // bf -- Consonant Hard DA
+                '\u0922', // c0 -- Consonant Hard DHA
+                '\u0923', // c1 -- Consonant Hard NA
+                '\u0924', // c2 -- Consonant Soft TA
+                '\u0925', // c3 -- Consonant Soft THA
+                '\u0926', // c4 -- Consonant Soft DA
+                '\u0927', // c5 -- Consonant Soft DHA
+                '\u0928', // c6 -- Consonant Soft NA
+                '\u0929', // c7 -- Consonant NA ( Tamil )
+                '\u092a', // c8 -- Consonant PA
+                '\u092b', // c9 -- Consonant PHA
+                '\u092c', // ca -- Consonant BA
+                '\u092d', // cb -- Consonant BHA
+                '\u092e', // cc -- Consonant MA
+                '\u092f', // cd -- Consonant YA
+                '\u095f', // ce -- Consonant JYA ( Bengali, Assamese & Oriya )
+                '\u0930', // cf -- Consonant RA
+                '\u0931', // d0 -- Consonant Hard RA ( Southern Scripts )
+                '\u0932', // d1 -- Consonant LA
+                '\u0933', // d2 -- Consonant Hard LA
+                '\u0934', // d3 -- Consonant ZHA ( Tamil & Malayalam )
+                '\u0935', // d4 -- Consonant VA
+                '\u0936', // d5 -- Consonant SHA
+                '\u0937', // d6 -- Consonant Hard SHA
+                '\u0938', // d7 -- Consonant SA
+                '\u0939', // d8 -- Consonant HA
+            };
+
+            checkRange(0xb3, 0xd8, expectConsChars, "INDIC CONSONANTS");
+
+            char[] matraChars = {
+                '\u093e', // da -- Vowel Sign AA
+                '\u093f', // db -- Vowel Sign I
+                '\u0940', // dc -- Vowel Sign II
+                '\u0941', // dd -- Vowel Sign U
+                '\u0942', // de -- Vowel Sign UU
+                '\u0943', // df -- Vowel Sign RI
+                '\u0946', // e0 -- Vowel Sign E ( Southern Scripts )
+                '\u0947', // e1 -- Vowel Sign EY
+                '\u0948', // e2 -- Vowel Sign AI
+                '\u0945', // e3 -- Vowel Sign AYE ( Devanagari Script )
+                '\u094a', // e4 -- Vowel Sign O ( Southern Scripts )
+                '\u094b', // e5 -- Vowel Sign OW
+                '\u094c', // e6 -- Vowel Sign AU
+                '\u0949' // e7 -- Vowel Sign AWE ( Devanagari Script )
+            };
+
+            // Matras or Vowel signs alter the implicit
+            // vowel sound associated with an Indic consonant.
+
+            checkRange(0xda, 0xe7, matraChars, "INDIC MATRAS");
+
+            char[] loneContextModifierChars = {
+            '\u094d', // e8 -- Vowel Omission Sign ( Halant )
+            '\u093c', // e9 -- Diacritic Sign ( Nukta )
+            '\u0964' // ea -- Full Stop ( Viram, Northern Scripts )
+            };
+
+            checkRange(0xe8, 0xea,
+                       loneContextModifierChars, "LONE INDIC CONTEXT CHARS");
+
+
+            // Test Indic script numeral chars
+            // (as opposed to international numerals)
+
+            char[] expectNumeralChars =
+            {
+                '\u0966', // f1 -- Digit 0
+                '\u0967', // f2 -- Digit 1
+                '\u0968', // f3 -- Digit 2
+                '\u0969', // f4 -- Digit 3
+                '\u096a', // f5 -- Digit 4
+                '\u096b', // f6 -- Digit 5
+                '\u096c', // f7 -- Digit 6
+                '\u096d', // f8 -- Digit 7
+                '\u096e', // f9 -- Digit 8
+                '\u096f'  // fa -- Digit 9
+            };
+
+            checkRange(0xf1, 0xfa,
+                       expectNumeralChars, "NUMERAL/DIGIT CHARACTERS");
+            int lookupOffset = 0;
+
+            char[] expectNuktaSub = {
+                '\u0950',
+                '\u090c',
+                '\u0961',
+                '\u0960',
+                '\u0962',
+                '\u0963',
+                '\u0944',
+                '\u093d'
+            };
+
+            /*
+             * ISCII uses a number of code extension techniques
+             * to access a number of lesser used characters.
+             * The Nukta character which ordinarily signifies
+             * a diacritic is used in combination with existing
+             * characters to escape them to a different character.
+             * value.
+            */
+
+            byte[] codeExtensionBytes = {
+                (byte)0xa1 , (byte)0xe9, // Chandrabindu + Nukta
+                                         // =>DEVANAGARI OM SIGN
+                (byte)0xa6 , (byte)0xe9, // Vowel I + Nukta
+                                         // => DEVANAGARI VOCALIC L
+                (byte)0xa7 , (byte)0xe9, // Vowel II + Nukta
+                                         // => DEVANAGARI VOCALIC LL
+                (byte)0xaa , (byte)0xe9, // Vowel RI + Nukta
+                                         // => DEVANAGARI VOCALIC RR
+                (byte)0xdb , (byte)0xe9, //  Vowel sign I + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC L
+                (byte)0xdc , (byte)0xe9, // Vowel sign II + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC LL
+
+                (byte)0xdf , (byte)0xe9, // Vowel sign Vocalic R + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC RR
+                (byte)0xea , (byte)0xe9  // Full stop/Phrase separator + Nukta
+                                         // => DEVANAGARI SIGN AVAGRAHA
+            };
+
+            lookupOffset = 0;
+            byte[] bytePair = new byte[2];
+
+            for (int i=0; i < (codeExtensionBytes.length)/2; i++ ) {
+                bytePair[0] = (byte) codeExtensionBytes[lookupOffset++];
+                bytePair[1] = (byte) codeExtensionBytes[lookupOffset++];
+
+                String unicodeStr = new String (bytePair,"ISCII91");
+                if (unicodeStr.charAt(0) != expectNuktaSub[i]) {
+                    throw new Exception("Failed Nukta Sub");
+                }
+            }
+
+            lookupOffset = 0;
+            byte[] comboBytes = {
+                (byte)0xe8 , (byte)0xe8, //HALANT + HALANT
+                (byte)0xe8 , (byte)0xe9  //HALANT + NUKTA    aka. Soft Halant
+            };
+            char[] expectCombChars = {
+                '\u094d',
+                '\u200c',
+                '\u094d',
+                '\u200d'
+            };
+
+            for (int i=0; i < (comboBytes.length)/2; i++ ) {
+                bytePair[0] = (byte) comboBytes[lookupOffset++];
+                bytePair[1] = (byte) comboBytes[lookupOffset];
+                String unicodeStr = new String (bytePair, "ISCII91");
+                if (unicodeStr.charAt(0) != expectCombChars[lookupOffset-1]
+                    && unicodeStr.charAt(1) != expectCombChars[lookupOffset]) {
+                    throw new Exception("Failed ISCII91 Regression Test");
+                }
+                lookupOffset++;
+            }
+
+        } catch (UnsupportedEncodingException e) {
+             System.err.println ("ISCII91 encoding not supported");
+             throw new Exception ("Failed ISCII91 Regression Test");
+        }
+    }
+
+    public static void main (String[] args) throws Exception {
+        test();
+    }
+}
diff --git a/jdk/test/sun/nio/cs/ISO2022JP.trailEsc b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc
new file mode 100644
index 0000000..0709a69
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc
@@ -0,0 +1,454 @@
+test0
+  $B!!(B $B!"(B $B!#(B $B!$(B $B!%(B $B!&(B $B!'(B $B!((B $B!)(B $B!*(B $B!+(B $B!,(B $B!-(B $B!.(B $B!/(B
+$B!0(B $B!1(B $B!2(B $B!3(B $B!4(B $B!5(B $B!6(B $B!7(B $B!8(B $B!9(B $B!:(B $B!;(B $B!<(B $B!=(B $B!>(B $B!?(B
+  $B!A(B $B!B(B $B!C(B $B!D(B $B!E(B $B!F(B $B!G(B $B!H(B $B!I(B $B!J(B $B!K(B $B!L(B $B!M(B $B!N(B $B!O(B
+$B!P(B $B!Q(B $B!R(B $B!S(B $B!T(B $B!U(B $B!V(B $B!W(B $B!X(B $B!Y(B $B!Z(B $B![(B $B!\(B $B!](B $B!^(B $B!_(B
+$B!`(B $B!a(B $B!b(B $B!c(B $B!d(B $B!e(B $B!f(B $B!g(B $B!h(B $B!i(B $B!j(B $B!k(B $B!l(B $B!m(B $B!n(B $B!o(B
+$B!p(B $B!q(B $B!r(B $B!s(B $B!t(B $B!u(B $B!v(B $B!w(B $B!x(B $B!y(B $B!z(B $B!{(B $B!|(B $B!}(B $B!~(B
+  $B"!(B $B""(B $B"#(B $B"$(B $B"%(B $B"&(B $B"'(B $B"((B $B")(B $B"*(B $B"+(B $B",(B $B"-(B $B".(B
+                    $B":(B $B";(B $B"<(B $B"=(B $B">(B $B"?(B
+$B"@(B $B"A(B                 $B"J(B $B"K(B $B"L(B $B"M(B $B"N(B $B"O(B
+$B"P(B                       $B"\(B $B"](B $B"^(B $B"_(B
+$B"`(B $B"a(B $B"b(B $B"c(B $B"d(B $B"e(B $B"f(B $B"g(B $B"h(B $B"i(B $B"j(B
+    $B"r(B $B"s(B $B"t(B $B"u(B $B"v(B $B"w(B $B"x(B $B"y(B         $B"~(B
+$B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B $B#7(B $B#8(B $B#9(B
+   $B#A(B $B#B(B $B#C(B $B#D(B $B#E(B $B#F(B $B#G(B $B#H(B $B#I(B $B#J(B $B#K(B $B#L(B $B#M(B $B#N(B $B#O(B
+$B#P(B $B#Q(B $B#R(B $B#S(B $B#T(B $B#U(B $B#V(B $B#W(B $B#X(B $B#Y(B $B#Z(B
+   $B#a(B $B#b(B $B#c(B $B#d(B $B#e(B $B#f(B $B#g(B $B#h(B $B#i(B $B#j(B $B#k(B $B#l(B $B#m(B $B#n(B $B#o(B
+$B#p(B $B#q(B $B#r(B $B#s(B $B#t(B $B#u(B $B#v(B $B#w(B $B#x(B $B#y(B $B#z(B
+   $B$!(B $B$"(B $B$#(B $B$$(B $B$%(B $B$&(B $B$'(B $B$((B $B$)(B $B$*(B $B$+(B $B$,(B $B$-(B $B$.(B $B$/(B
+$B$0(B $B$1(B $B$2(B $B$3(B $B$4(B $B$5(B $B$6(B $B$7(B $B$8(B $B$9(B $B$:(B $B$;(B $B$<(B $B$=(B $B$>(B $B$?(B
+$B$@(B $B$A(B $B$B(B $B$C(B $B$D(B $B$E(B $B$F(B $B$G(B $B$H(B $B$I(B $B$J(B $B$K(B $B$L(B $B$M(B $B$N(B $B$O(B
+$B$P(B $B$Q(B $B$R(B $B$S(B $B$T(B $B$U(B $B$V(B $B$W(B $B$X(B $B$Y(B $B$Z(B $B$[(B $B$\(B $B$](B $B$^(B $B$_(B
+$B$`(B $B$a(B $B$b(B $B$c(B $B$d(B $B$e(B $B$f(B $B$g(B $B$h(B $B$i(B $B$j(B $B$k(B $B$l(B $B$m(B $B$n(B $B$o(B
+$B$p(B $B$q(B $B$r(B $B$s(B
+   $B%!(B $B%"(B $B%#(B $B%$(B $B%%(B $B%&(B $B%'(B $B%((B $B%)(B $B%*(B $B%+(B $B%,(B $B%-(B $B%.(B $B%/(B
+$B%0(B $B%1(B $B%2(B $B%3(B $B%4(B $B%5(B $B%6(B $B%7(B $B%8(B $B%9(B $B%:(B $B%;(B $B%<(B $B%=(B $B%>(B $B%?(B
+$B%@(B $B%A(B $B%B(B $B%C(B $B%D(B $B%E(B $B%F(B $B%G(B $B%H(B $B%I(B $B%J(B $B%K(B $B%L(B $B%M(B $B%N(B $B%O(B
+$B%P(B $B%Q(B $B%R(B $B%S(B $B%T(B $B%U(B $B%V(B $B%W(B $B%X(B $B%Y(B $B%Z(B $B%[(B $B%\(B $B%](B $B%^(B $B%_(B
+$B%`(B $B%a(B $B%b(B $B%c(B $B%d(B $B%e(B $B%f(B $B%g(B $B%h(B $B%i(B $B%j(B $B%k(B $B%l(B $B%m(B $B%n(B $B%o(B
+$B%p(B $B%q(B $B%r(B $B%s(B $B%t(B $B%u(B $B%v(B
+  $B&!(B $B&"(B $B&#(B $B&$(B $B&%(B $B&&(B $B&'(B $B&((B $B&)(B $B&*(B $B&+(B $B&,(B $B&-(B $B&.(B $B&/(B
+$B&0(B $B&1(B $B&2(B $B&3(B $B&4(B $B&5(B $B&6(B $B&7(B $B&8(B
+  $B&A(B $B&B(B $B&C(B $B&D(B $B&E(B $B&F(B $B&G(B $B&H(B $B&I(B $B&J(B $B&K(B $B&L(B $B&M(B $B&N(B $B&O(B
+$B&P(B $B&Q(B $B&R(B $B&S(B $B&T(B $B&U(B $B&V(B $B&W(B $B&X(B
+  $B'!(B $B'"(B $B'#(B $B'$(B $B'%(B $B'&(B $B''(B $B'((B $B')(B $B'*(B $B'+(B $B',(B $B'-(B $B'.(B $B'/(B
+$B'0(B $B'1(B $B'2(B $B'3(B $B'4(B $B'5(B $B'6(B $B'7(B $B'8(B $B'9(B $B':(B $B';(B $B'<(B $B'=(B $B'>(B $B'?(B
+$B'@(B $B'A(B
+  $B'Q(B $B'R(B $B'S(B $B'T(B $B'U(B $B'V(B $B'W(B $B'X(B $B'Y(B $B'Z(B $B'[(B $B'\(B $B'](B $B'^(B $B'_(B
+$B'`(B $B'a(B $B'b(B $B'c(B $B'd(B $B'e(B $B'f(B $B'g(B $B'h(B $B'i(B $B'j(B $B'k(B $B'l(B $B'm(B $B'n(B $B'o(B
+$B'p(B $B'q(B
+  $B(!(B $B("(B $B(#(B $B($(B $B(%(B $B(&(B $B('(B $B(((B $B()(B $B(*(B $B(+(B $B(,(B $B(-(B $B(.(B $B(/(B
+$B(0(B $B(1(B $B(2(B $B(3(B $B(4(B $B(5(B $B(6(B $B(7(B $B(8(B $B(9(B $B(:(B $B(;(B $B(<(B $B(=(B $B(>(B $B(?(B
+$B(@(B
+   $B0!(B $B0"(B $B0#(B $B0$(B $B0%(B $B0&(B $B0'(B $B0((B $B0)(B $B0*(B $B0+(B $B0,(B $B0-(B $B0.(B $B0/(B
+$B00(B $B01(B $B02(B $B03(B $B04(B $B05(B $B06(B $B07(B $B08(B $B09(B $B0:(B $B0;(B $B0<(B $B0=(B $B0>(B $B0?(B
+$B0@(B $B0A(B $B0B(B $B0C(B $B0D(B $B0E(B $B0F(B $B0G(B $B0H(B $B0I(B $B0J(B $B0K(B $B0L(B $B0M(B $B0N(B $B0O(B
+$B0P(B $B0Q(B $B0R(B $B0S(B $B0T(B $B0U(B $B0V(B $B0W(B $B0X(B $B0Y(B $B0Z(B $B0[(B $B0\(B $B0](B $B0^(B $B0_(B
+$B0`(B $B0a(B $B0b(B $B0c(B $B0d(B $B0e(B $B0f(B $B0g(B $B0h(B $B0i(B $B0j(B $B0k(B $B0l(B $B0m(B $B0n(B $B0o(B
+$B0p(B $B0q(B $B0r(B $B0s(B $B0t(B $B0u(B $B0v(B $B0w(B $B0x(B $B0y(B $B0z(B $B0{(B $B0|(B $B0}(B $B0~(B
+   $B1!(B $B1"(B $B1#(B $B1$(B $B1%(B $B1&(B $B1'(B $B1((B $B1)(B $B1*(B $B1+(B $B1,(B $B1-(B $B1.(B $B1/(B
+$B10(B $B11(B $B12(B $B13(B $B14(B $B15(B $B16(B $B17(B $B18(B $B19(B $B1:(B $B1;(B $B1<(B $B1=(B $B1>(B $B1?(B
+$B1@(B $B1A(B $B1B(B $B1C(B $B1D(B $B1E(B $B1F(B $B1G(B $B1H(B $B1I(B $B1J(B $B1K(B $B1L(B $B1M(B $B1N(B $B1O(B
+$B1P(B $B1Q(B $B1R(B $B1S(B $B1T(B $B1U(B $B1V(B $B1W(B $B1X(B $B1Y(B $B1Z(B $B1[(B $B1\(B $B1](B $B1^(B $B1_(B
+$B1`(B $B1a(B $B1b(B $B1c(B $B1d(B $B1e(B $B1f(B $B1g(B $B1h(B $B1i(B $B1j(B $B1k(B $B1l(B $B1m(B $B1n(B $B1o(B
+$B1p(B $B1q(B $B1r(B $B1s(B $B1t(B $B1u(B $B1v(B $B1w(B $B1x(B $B1y(B $B1z(B $B1{(B $B1|(B $B1}(B $B1~(B
+   $B2!(B $B2"(B $B2#(B $B2$(B $B2%(B $B2&(B $B2'(B $B2((B $B2)(B $B2*(B $B2+(B $B2,(B $B2-(B $B2.(B $B2/(B
+$B20(B $B21(B $B22(B $B23(B $B24(B $B25(B $B26(B $B27(B $B28(B $B29(B $B2:(B $B2;(B $B2<(B $B2=(B $B2>(B $B2?(B
+$B2@(B $B2A(B $B2B(B $B2C(B $B2D(B $B2E(B $B2F(B $B2G(B $B2H(B $B2I(B $B2J(B $B2K(B $B2L(B $B2M(B $B2N(B $B2O(B
+$B2P(B $B2Q(B $B2R(B $B2S(B $B2T(B $B2U(B $B2V(B $B2W(B $B2X(B $B2Y(B $B2Z(B $B2[(B $B2\(B $B2](B $B2^(B $B2_(B
+$B2`(B $B2a(B $B2b(B $B2c(B $B2d(B $B2e(B $B2f(B $B2g(B $B2h(B $B2i(B $B2j(B $B2k(B $B2l(B $B2m(B $B2n(B $B2o(B
+$B2p(B $B2q(B $B2r(B $B2s(B $B2t(B $B2u(B $B2v(B $B2w(B $B2x(B $B2y(B $B2z(B $B2{(B $B2|(B $B2}(B $B2~(B
+   $B3!(B $B3"(B $B3#(B $B3$(B $B3%(B $B3&(B $B3'(B $B3((B $B3)(B $B3*(B $B3+(B $B3,(B $B3-(B $B3.(B $B3/(B
+$B30(B $B31(B $B32(B $B33(B $B34(B $B35(B $B36(B $B37(B $B38(B $B39(B $B3:(B $B3;(B $B3<(B $B3=(B $B3>(B $B3?(B
+$B3@(B $B3A(B $B3B(B $B3C(B $B3D(B $B3E(B $B3F(B $B3G(B $B3H(B $B3I(B $B3J(B $B3K(B $B3L(B $B3M(B $B3N(B $B3O(B
+$B3P(B $B3Q(B $B3R(B $B3S(B $B3T(B $B3U(B $B3V(B $B3W(B $B3X(B $B3Y(B $B3Z(B $B3[(B $B3\(B $B3](B $B3^(B $B3_(B
+$B3`(B $B3a(B $B3b(B $B3c(B $B3d(B $B3e(B $B3f(B $B3g(B $B3h(B $B3i(B $B3j(B $B3k(B $B3l(B $B3m(B $B3n(B $B3o(B
+$B3p(B $B3q(B $B3r(B $B3s(B $B3t(B $B3u(B $B3v(B $B3w(B $B3x(B $B3y(B $B3z(B $B3{(B $B3|(B $B3}(B $B3~(B
+   $B4!(B $B4"(B $B4#(B $B4$(B $B4%(B $B4&(B $B4'(B $B4((B $B4)(B $B4*(B $B4+(B $B4,(B $B4-(B $B4.(B $B4/(B
+$B40(B $B41(B $B42(B $B43(B $B44(B $B45(B $B46(B $B47(B $B48(B $B49(B $B4:(B $B4;(B $B4<(B $B4=(B $B4>(B $B4?(B
+$B4@(B $B4A(B $B4B(B $B4C(B $B4D(B $B4E(B $B4F(B $B4G(B $B4H(B $B4I(B $B4J(B $B4K(B $B4L(B $B4M(B $B4N(B $B4O(B
+$B4P(B $B4Q(B $B4R(B $B4S(B $B4T(B $B4U(B $B4V(B $B4W(B $B4X(B $B4Y(B $B4Z(B $B4[(B $B4\(B $B4](B $B4^(B $B4_(B
+$B4`(B $B4a(B $B4b(B $B4c(B $B4d(B $B4e(B $B4f(B $B4g(B $B4h(B $B4i(B $B4j(B $B4k(B $B4l(B $B4m(B $B4n(B $B4o(B
+$B4p(B $B4q(B $B4r(B $B4s(B $B4t(B $B4u(B $B4v(B $B4w(B $B4x(B $B4y(B $B4z(B $B4{(B $B4|(B $B4}(B $B4~(B
+   $B5!(B $B5"(B $B5#(B $B5$(B $B5%(B $B5&(B $B5'(B $B5((B $B5)(B $B5*(B $B5+(B $B5,(B $B5-(B $B5.(B $B5/(B
+$B50(B $B51(B $B52(B $B53(B $B54(B $B55(B $B56(B $B57(B $B58(B $B59(B $B5:(B $B5;(B $B5<(B $B5=(B $B5>(B $B5?(B
+$B5@(B $B5A(B $B5B(B $B5C(B $B5D(B $B5E(B $B5F(B $B5G(B $B5H(B $B5I(B $B5J(B $B5K(B $B5L(B $B5M(B $B5N(B $B5O(B
+$B5P(B $B5Q(B $B5R(B $B5S(B $B5T(B $B5U(B $B5V(B $B5W(B $B5X(B $B5Y(B $B5Z(B $B5[(B $B5\(B $B5](B $B5^(B $B5_(B
+$B5`(B $B5a(B $B5b(B $B5c(B $B5d(B $B5e(B $B5f(B $B5g(B $B5h(B $B5i(B $B5j(B $B5k(B $B5l(B $B5m(B $B5n(B $B5o(B
+$B5p(B $B5q(B $B5r(B $B5s(B $B5t(B $B5u(B $B5v(B $B5w(B $B5x(B $B5y(B $B5z(B $B5{(B $B5|(B $B5}(B $B5~(B
+   $B6!(B $B6"(B $B6#(B $B6$(B $B6%(B $B6&(B $B6'(B $B6((B $B6)(B $B6*(B $B6+(B $B6,(B $B6-(B $B6.(B $B6/(B
+$B60(B $B61(B $B62(B $B63(B $B64(B $B65(B $B66(B $B67(B $B68(B $B69(B $B6:(B $B6;(B $B6<(B $B6=(B $B6>(B $B6?(B
+$B6@(B $B6A(B $B6B(B $B6C(B $B6D(B $B6E(B $B6F(B $B6G(B $B6H(B $B6I(B $B6J(B $B6K(B $B6L(B $B6M(B $B6N(B $B6O(B
+$B6P(B $B6Q(B $B6R(B $B6S(B $B6T(B $B6U(B $B6V(B $B6W(B $B6X(B $B6Y(B $B6Z(B $B6[(B $B6\(B $B6](B $B6^(B $B6_(B
+$B6`(B $B6a(B $B6b(B $B6c(B $B6d(B $B6e(B $B6f(B $B6g(B $B6h(B $B6i(B $B6j(B $B6k(B $B6l(B $B6m(B $B6n(B $B6o(B
+$B6p(B $B6q(B $B6r(B $B6s(B $B6t(B $B6u(B $B6v(B $B6w(B $B6x(B $B6y(B $B6z(B $B6{(B $B6|(B $B6}(B $B6~(B
+   $B7!(B $B7"(B $B7#(B $B7$(B $B7%(B $B7&(B $B7'(B $B7((B $B7)(B $B7*(B $B7+(B $B7,(B $B7-(B $B7.(B $B7/(B
+$B70(B $B71(B $B72(B $B73(B $B74(B $B75(B $B76(B $B77(B $B78(B $B79(B $B7:(B $B7;(B $B7<(B $B7=(B $B7>(B $B7?(B
+$B7@(B $B7A(B $B7B(B $B7C(B $B7D(B $B7E(B $B7F(B $B7G(B $B7H(B $B7I(B $B7J(B $B7K(B $B7L(B $B7M(B $B7N(B $B7O(B
+$B7P(B $B7Q(B $B7R(B $B7S(B $B7T(B $B7U(B $B7V(B $B7W(B $B7X(B $B7Y(B $B7Z(B $B7[(B $B7\(B $B7](B $B7^(B $B7_(B
+$B7`(B $B7a(B $B7b(B $B7c(B $B7d(B $B7e(B $B7f(B $B7g(B $B7h(B $B7i(B $B7j(B $B7k(B $B7l(B $B7m(B $B7n(B $B7o(B
+$B7p(B $B7q(B $B7r(B $B7s(B $B7t(B $B7u(B $B7v(B $B7w(B $B7x(B $B7y(B $B7z(B $B7{(B $B7|(B $B7}(B $B7~(B
+   $B8!(B $B8"(B $B8#(B $B8$(B $B8%(B $B8&(B $B8'(B $B8((B $B8)(B $B8*(B $B8+(B $B8,(B $B8-(B $B8.(B $B8/(B
+$B80(B $B81(B $B82(B $B83(B $B84(B $B85(B $B86(B $B87(B $B88(B $B89(B $B8:(B $B8;(B $B8<(B $B8=(B $B8>(B $B8?(B
+$B8@(B $B8A(B $B8B(B $B8C(B $B8D(B $B8E(B $B8F(B $B8G(B $B8H(B $B8I(B $B8J(B $B8K(B $B8L(B $B8M(B $B8N(B $B8O(B
+$B8P(B $B8Q(B $B8R(B $B8S(B $B8T(B $B8U(B $B8V(B $B8W(B $B8X(B $B8Y(B $B8Z(B $B8[(B $B8\(B $B8](B $B8^(B $B8_(B
+$B8`(B $B8a(B $B8b(B $B8c(B $B8d(B $B8e(B $B8f(B $B8g(B $B8h(B $B8i(B $B8j(B $B8k(B $B8l(B $B8m(B $B8n(B $B8o(B
+$B8p(B $B8q(B $B8r(B $B8s(B $B8t(B $B8u(B $B8v(B $B8w(B $B8x(B $B8y(B $B8z(B $B8{(B $B8|(B $B8}(B $B8~(B
+   $B9!(B $B9"(B $B9#(B $B9$(B $B9%(B $B9&(B $B9'(B $B9((B $B9)(B $B9*(B $B9+(B $B9,(B $B9-(B $B9.(B $B9/(B
+$B90(B $B91(B $B92(B $B93(B $B94(B $B95(B $B96(B $B97(B $B98(B $B99(B $B9:(B $B9;(B $B9<(B $B9=(B $B9>(B $B9?(B
+$B9@(B $B9A(B $B9B(B $B9C(B $B9D(B $B9E(B $B9F(B $B9G(B $B9H(B $B9I(B $B9J(B $B9K(B $B9L(B $B9M(B $B9N(B $B9O(B
+$B9P(B $B9Q(B $B9R(B $B9S(B $B9T(B $B9U(B $B9V(B $B9W(B $B9X(B $B9Y(B $B9Z(B $B9[(B $B9\(B $B9](B $B9^(B $B9_(B
+$B9`(B $B9a(B $B9b(B $B9c(B $B9d(B $B9e(B $B9f(B $B9g(B $B9h(B $B9i(B $B9j(B $B9k(B $B9l(B $B9m(B $B9n(B $B9o(B
+$B9p(B $B9q(B $B9r(B $B9s(B $B9t(B $B9u(B $B9v(B $B9w(B $B9x(B $B9y(B $B9z(B $B9{(B $B9|(B $B9}(B $B9~(B
+   $B:!(B $B:"(B $B:#(B $B:$(B $B:%(B $B:&(B $B:'(B $B:((B $B:)(B $B:*(B $B:+(B $B:,(B $B:-(B $B:.(B $B:/(B
+$B:0(B $B:1(B $B:2(B $B:3(B $B:4(B $B:5(B $B:6(B $B:7(B $B:8(B $B:9(B $B::(B $B:;(B $B:<(B $B:=(B $B:>(B $B:?(B
+$B:@(B $B:A(B $B:B(B $B:C(B $B:D(B $B:E(B $B:F(B $B:G(B $B:H(B $B:I(B $B:J(B $B:K(B $B:L(B $B:M(B $B:N(B $B:O(B
+$B:P(B $B:Q(B $B:R(B $B:S(B $B:T(B $B:U(B $B:V(B $B:W(B $B:X(B $B:Y(B $B:Z(B $B:[(B $B:\(B $B:](B $B:^(B $B:_(B
+$B:`(B $B:a(B $B:b(B $B:c(B $B:d(B $B:e(B $B:f(B $B:g(B $B:h(B $B:i(B $B:j(B $B:k(B $B:l(B $B:m(B $B:n(B $B:o(B
+$B:p(B $B:q(B $B:r(B $B:s(B $B:t(B $B:u(B $B:v(B $B:w(B $B:x(B $B:y(B $B:z(B $B:{(B $B:|(B $B:}(B $B:~(B
+   $B;!(B $B;"(B $B;#(B $B;$(B $B;%(B $B;&(B $B;'(B $B;((B $B;)(B $B;*(B $B;+(B $B;,(B $B;-(B $B;.(B $B;/(B
+$B;0(B $B;1(B $B;2(B $B;3(B $B;4(B $B;5(B $B;6(B $B;7(B $B;8(B $B;9(B $B;:(B $B;;(B $B;<(B $B;=(B $B;>(B $B;?(B
+$B;@(B $B;A(B $B;B(B $B;C(B $B;D(B $B;E(B $B;F(B $B;G(B $B;H(B $B;I(B $B;J(B $B;K(B $B;L(B $B;M(B $B;N(B $B;O(B
+$B;P(B $B;Q(B $B;R(B $B;S(B $B;T(B $B;U(B $B;V(B $B;W(B $B;X(B $B;Y(B $B;Z(B $B;[(B $B;\(B $B;](B $B;^(B $B;_(B
+$B;`(B $B;a(B $B;b(B $B;c(B $B;d(B $B;e(B $B;f(B $B;g(B $B;h(B $B;i(B $B;j(B $B;k(B $B;l(B $B;m(B $B;n(B $B;o(B
+$B;p(B $B;q(B $B;r(B $B;s(B $B;t(B $B;u(B $B;v(B $B;w(B $B;x(B $B;y(B $B;z(B $B;{(B $B;|(B $B;}(B $B;~(B
+   $B<!(B $B<"(B $B<#(B $B<$(B $B<%(B $B<&(B $B<'(B $B<((B $B<)(B $B<*(B $B<+(B $B<,(B $B<-(B $B<.(B $B</(B
+$B<0(B $B<1(B $B<2(B $B<3(B $B<4(B $B<5(B $B<6(B $B<7(B $B<8(B $B<9(B $B<:(B $B<;(B $B<<(B $B<=(B $B<>(B $B<?(B
+$B<@(B $B<A(B $B<B(B $B<C(B $B<D(B $B<E(B $B<F(B $B<G(B $B<H(B $B<I(B $B<J(B $B<K(B $B<L(B $B<M(B $B<N(B $B<O(B
+$B<P(B $B<Q(B $B<R(B $B<S(B $B<T(B $B<U(B $B<V(B $B<W(B $B<X(B $B<Y(B $B<Z(B $B<[(B $B<\(B $B<](B $B<^(B $B<_(B
+$B<`(B $B<a(B $B<b(B $B<c(B $B<d(B $B<e(B $B<f(B $B<g(B $B<h(B $B<i(B $B<j(B $B<k(B $B<l(B $B<m(B $B<n(B $B<o(B
+$B<p(B $B<q(B $B<r(B $B<s(B $B<t(B $B<u(B $B<v(B $B<w(B $B<x(B $B<y(B $B<z(B $B<{(B $B<|(B $B<}(B $B<~(B
+   $B=!(B $B="(B $B=#(B $B=$(B $B=%(B $B=&(B $B='(B $B=((B $B=)(B $B=*(B $B=+(B $B=,(B $B=-(B $B=.(B $B=/(B
+$B=0(B $B=1(B $B=2(B $B=3(B $B=4(B $B=5(B $B=6(B $B=7(B $B=8(B $B=9(B $B=:(B $B=;(B $B=<(B $B==(B $B=>(B $B=?(B
+$B=@(B $B=A(B $B=B(B $B=C(B $B=D(B $B=E(B $B=F(B $B=G(B $B=H(B $B=I(B $B=J(B $B=K(B $B=L(B $B=M(B $B=N(B $B=O(B
+$B=P(B $B=Q(B $B=R(B $B=S(B $B=T(B $B=U(B $B=V(B $B=W(B $B=X(B $B=Y(B $B=Z(B $B=[(B $B=\(B $B=](B $B=^(B $B=_(B
+$B=`(B $B=a(B $B=b(B $B=c(B $B=d(B $B=e(B $B=f(B $B=g(B $B=h(B $B=i(B $B=j(B $B=k(B $B=l(B $B=m(B $B=n(B $B=o(B
+$B=p(B $B=q(B $B=r(B $B=s(B $B=t(B $B=u(B $B=v(B $B=w(B $B=x(B $B=y(B $B=z(B $B={(B $B=|(B $B=}(B $B=~(B
+   $B>!(B $B>"(B $B>#(B $B>$(B $B>%(B $B>&(B $B>'(B $B>((B $B>)(B $B>*(B $B>+(B $B>,(B $B>-(B $B>.(B $B>/(B
+$B>0(B $B>1(B $B>2(B $B>3(B $B>4(B $B>5(B $B>6(B $B>7(B $B>8(B $B>9(B $B>:(B $B>;(B $B><(B $B>=(B $B>>(B $B>?(B
+$B>@(B $B>A(B $B>B(B $B>C(B $B>D(B $B>E(B $B>F(B $B>G(B $B>H(B $B>I(B $B>J(B $B>K(B $B>L(B $B>M(B $B>N(B $B>O(B
+$B>P(B $B>Q(B $B>R(B $B>S(B $B>T(B $B>U(B $B>V(B $B>W(B $B>X(B $B>Y(B $B>Z(B $B>[(B $B>\(B $B>](B $B>^(B $B>_(B
+$B>`(B $B>a(B $B>b(B $B>c(B $B>d(B $B>e(B $B>f(B $B>g(B $B>h(B $B>i(B $B>j(B $B>k(B $B>l(B $B>m(B $B>n(B $B>o(B
+$B>p(B $B>q(B $B>r(B $B>s(B $B>t(B $B>u(B $B>v(B $B>w(B $B>x(B $B>y(B $B>z(B $B>{(B $B>|(B $B>}(B $B>~(B
+   $B?!(B $B?"(B $B?#(B $B?$(B $B?%(B $B?&(B $B?'(B $B?((B $B?)(B $B?*(B $B?+(B $B?,(B $B?-(B $B?.(B $B?/(B
+$B?0(B $B?1(B $B?2(B $B?3(B $B?4(B $B?5(B $B?6(B $B?7(B $B?8(B $B?9(B $B?:(B $B?;(B $B?<(B $B?=(B $B?>(B $B??(B
+$B?@(B $B?A(B $B?B(B $B?C(B $B?D(B $B?E(B $B?F(B $B?G(B $B?H(B $B?I(B $B?J(B $B?K(B $B?L(B $B?M(B $B?N(B $B?O(B
+$B?P(B $B?Q(B $B?R(B $B?S(B $B?T(B $B?U(B $B?V(B $B?W(B $B?X(B $B?Y(B $B?Z(B $B?[(B $B?\(B $B?](B $B?^(B $B?_(B
+$B?`(B $B?a(B $B?b(B $B?c(B $B?d(B $B?e(B $B?f(B $B?g(B $B?h(B $B?i(B $B?j(B $B?k(B $B?l(B $B?m(B $B?n(B $B?o(B
+$B?p(B $B?q(B $B?r(B $B?s(B $B?t(B $B?u(B $B?v(B $B?w(B $B?x(B $B?y(B $B?z(B $B?{(B $B?|(B $B?}(B $B?~(B
+   $B@!(B $B@"(B $B@#(B $B@$(B $B@%(B $B@&(B $B@'(B $B@((B $B@)(B $B@*(B $B@+(B $B@,(B $B@-(B $B@.(B $B@/(B
+$B@0(B $B@1(B $B@2(B $B@3(B $B@4(B $B@5(B $B@6(B $B@7(B $B@8(B $B@9(B $B@:(B $B@;(B $B@<(B $B@=(B $B@>(B $B@?(B
+$B@@(B $B@A(B $B@B(B $B@C(B $B@D(B $B@E(B $B@F(B $B@G(B $B@H(B $B@I(B $B@J(B $B@K(B $B@L(B $B@M(B $B@N(B $B@O(B
+$B@P(B $B@Q(B $B@R(B $B@S(B $B@T(B $B@U(B $B@V(B $B@W(B $B@X(B $B@Y(B $B@Z(B $B@[(B $B@\(B $B@](B $B@^(B $B@_(B
+$B@`(B $B@a(B $B@b(B $B@c(B $B@d(B $B@e(B $B@f(B $B@g(B $B@h(B $B@i(B $B@j(B $B@k(B $B@l(B $B@m(B $B@n(B $B@o(B
+$B@p(B $B@q(B $B@r(B $B@s(B $B@t(B $B@u(B $B@v(B $B@w(B $B@x(B $B@y(B $B@z(B $B@{(B $B@|(B $B@}(B $B@~(B
+   $BA!(B $BA"(B $BA#(B $BA$(B $BA%(B $BA&(B $BA'(B $BA((B $BA)(B $BA*(B $BA+(B $BA,(B $BA-(B $BA.(B $BA/(B
+$BA0(B $BA1(B $BA2(B $BA3(B $BA4(B $BA5(B $BA6(B $BA7(B $BA8(B $BA9(B $BA:(B $BA;(B $BA<(B $BA=(B $BA>(B $BA?(B
+$BA@(B $BAA(B $BAB(B $BAC(B $BAD(B $BAE(B $BAF(B $BAG(B $BAH(B $BAI(B $BAJ(B $BAK(B $BAL(B $BAM(B $BAN(B $BAO(B
+$BAP(B $BAQ(B $BAR(B $BAS(B $BAT(B $BAU(B $BAV(B $BAW(B $BAX(B $BAY(B $BAZ(B $BA[(B $BA\(B $BA](B $BA^(B $BA_(B
+$BA`(B $BAa(B $BAb(B $BAc(B $BAd(B $BAe(B $BAf(B $BAg(B $BAh(B $BAi(B $BAj(B $BAk(B $BAl(B $BAm(B $BAn(B $BAo(B
+$BAp(B $BAq(B $BAr(B $BAs(B $BAt(B $BAu(B $BAv(B $BAw(B $BAx(B $BAy(B $BAz(B $BA{(B $BA|(B $BA}(B $BA~(B
+   $BB!(B $BB"(B $BB#(B $BB$(B $BB%(B $BB&(B $BB'(B $BB((B $BB)(B $BB*(B $BB+(B $BB,(B $BB-(B $BB.(B $BB/(B
+$BB0(B $BB1(B $BB2(B $BB3(B $BB4(B $BB5(B $BB6(B $BB7(B $BB8(B $BB9(B $BB:(B $BB;(B $BB<(B $BB=(B $BB>(B $BB?(B
+$BB@(B $BBA(B $BBB(B $BBC(B $BBD(B $BBE(B $BBF(B $BBG(B $BBH(B $BBI(B $BBJ(B $BBK(B $BBL(B $BBM(B $BBN(B $BBO(B
+$BBP(B $BBQ(B $BBR(B $BBS(B $BBT(B $BBU(B $BBV(B $BBW(B $BBX(B $BBY(B $BBZ(B $BB[(B $BB\(B $BB](B $BB^(B $BB_(B
+$BB`(B $BBa(B $BBb(B $BBc(B $BBd(B $BBe(B $BBf(B $BBg(B $BBh(B $BBi(B $BBj(B $BBk(B $BBl(B $BBm(B $BBn(B $BBo(B
+$BBp(B $BBq(B $BBr(B $BBs(B $BBt(B $BBu(B $BBv(B $BBw(B $BBx(B $BBy(B $BBz(B $BB{(B $BB|(B $BB}(B $BB~(B
+   $BC!(B $BC"(B $BC#(B $BC$(B $BC%(B $BC&(B $BC'(B $BC((B $BC)(B $BC*(B $BC+(B $BC,(B $BC-(B $BC.(B $BC/(B
+$BC0(B $BC1(B $BC2(B $BC3(B $BC4(B $BC5(B $BC6(B $BC7(B $BC8(B $BC9(B $BC:(B $BC;(B $BC<(B $BC=(B $BC>(B $BC?(B
+$BC@(B $BCA(B $BCB(B $BCC(B $BCD(B $BCE(B $BCF(B $BCG(B $BCH(B $BCI(B $BCJ(B $BCK(B $BCL(B $BCM(B $BCN(B $BCO(B
+$BCP(B $BCQ(B $BCR(B $BCS(B $BCT(B $BCU(B $BCV(B $BCW(B $BCX(B $BCY(B $BCZ(B $BC[(B $BC\(B $BC](B $BC^(B $BC_(B
+$BC`(B $BCa(B $BCb(B $BCc(B $BCd(B $BCe(B $BCf(B $BCg(B $BCh(B $BCi(B $BCj(B $BCk(B $BCl(B $BCm(B $BCn(B $BCo(B
+$BCp(B $BCq(B $BCr(B $BCs(B $BCt(B $BCu(B $BCv(B $BCw(B $BCx(B $BCy(B $BCz(B $BC{(B $BC|(B $BC}(B $BC~(B
+   $BD!(B $BD"(B $BD#(B $BD$(B $BD%(B $BD&(B $BD'(B $BD((B $BD)(B $BD*(B $BD+(B $BD,(B $BD-(B $BD.(B $BD/(B
+$BD0(B $BD1(B $BD2(B $BD3(B $BD4(B $BD5(B $BD6(B $BD7(B $BD8(B $BD9(B $BD:(B $BD;(B $BD<(B $BD=(B $BD>(B $BD?(B
+$BD@(B $BDA(B $BDB(B $BDC(B $BDD(B $BDE(B $BDF(B $BDG(B $BDH(B $BDI(B $BDJ(B $BDK(B $BDL(B $BDM(B $BDN(B $BDO(B
+$BDP(B $BDQ(B $BDR(B $BDS(B $BDT(B $BDU(B $BDV(B $BDW(B $BDX(B $BDY(B $BDZ(B $BD[(B $BD\(B $BD](B $BD^(B $BD_(B
+$BD`(B $BDa(B $BDb(B $BDc(B $BDd(B $BDe(B $BDf(B $BDg(B $BDh(B $BDi(B $BDj(B $BDk(B $BDl(B $BDm(B $BDn(B $BDo(B
+$BDp(B $BDq(B $BDr(B $BDs(B $BDt(B $BDu(B $BDv(B $BDw(B $BDx(B $BDy(B $BDz(B $BD{(B $BD|(B $BD}(B $BD~(B
+   $BE!(B $BE"(B $BE#(B $BE$(B $BE%(B $BE&(B $BE'(B $BE((B $BE)(B $BE*(B $BE+(B $BE,(B $BE-(B $BE.(B $BE/(B
+$BE0(B $BE1(B $BE2(B $BE3(B $BE4(B $BE5(B $BE6(B $BE7(B $BE8(B $BE9(B $BE:(B $BE;(B $BE<(B $BE=(B $BE>(B $BE?(B
+$BE@(B $BEA(B $BEB(B $BEC(B $BED(B $BEE(B $BEF(B $BEG(B $BEH(B $BEI(B $BEJ(B $BEK(B $BEL(B $BEM(B $BEN(B $BEO(B
+$BEP(B $BEQ(B $BER(B $BES(B $BET(B $BEU(B $BEV(B $BEW(B $BEX(B $BEY(B $BEZ(B $BE[(B $BE\(B $BE](B $BE^(B $BE_(B
+$BE`(B $BEa(B $BEb(B $BEc(B $BEd(B $BEe(B $BEf(B $BEg(B $BEh(B $BEi(B $BEj(B $BEk(B $BEl(B $BEm(B $BEn(B $BEo(B
+$BEp(B $BEq(B $BEr(B $BEs(B $BEt(B $BEu(B $BEv(B $BEw(B $BEx(B $BEy(B $BEz(B $BE{(B $BE|(B $BE}(B $BE~(B
+   $BF!(B $BF"(B $BF#(B $BF$(B $BF%(B $BF&(B $BF'(B $BF((B $BF)(B $BF*(B $BF+(B $BF,(B $BF-(B $BF.(B $BF/(B
+$BF0(B $BF1(B $BF2(B $BF3(B $BF4(B $BF5(B $BF6(B $BF7(B $BF8(B $BF9(B $BF:(B $BF;(B $BF<(B $BF=(B $BF>(B $BF?(B
+$BF@(B $BFA(B $BFB(B $BFC(B $BFD(B $BFE(B $BFF(B $BFG(B $BFH(B $BFI(B $BFJ(B $BFK(B $BFL(B $BFM(B $BFN(B $BFO(B
+$BFP(B $BFQ(B $BFR(B $BFS(B $BFT(B $BFU(B $BFV(B $BFW(B $BFX(B $BFY(B $BFZ(B $BF[(B $BF\(B $BF](B $BF^(B $BF_(B
+$BF`(B $BFa(B $BFb(B $BFc(B $BFd(B $BFe(B $BFf(B $BFg(B $BFh(B $BFi(B $BFj(B $BFk(B $BFl(B $BFm(B $BFn(B $BFo(B
+$BFp(B $BFq(B $BFr(B $BFs(B $BFt(B $BFu(B $BFv(B $BFw(B $BFx(B $BFy(B $BFz(B $BF{(B $BF|(B $BF}(B $BF~(B
+   $BG!(B $BG"(B $BG#(B $BG$(B $BG%(B $BG&(B $BG'(B $BG((B $BG)(B $BG*(B $BG+(B $BG,(B $BG-(B $BG.(B $BG/(B
+$BG0(B $BG1(B $BG2(B $BG3(B $BG4(B $BG5(B $BG6(B $BG7(B $BG8(B $BG9(B $BG:(B $BG;(B $BG<(B $BG=(B $BG>(B $BG?(B
+$BG@(B $BGA(B $BGB(B $BGC(B $BGD(B $BGE(B $BGF(B $BGG(B $BGH(B $BGI(B $BGJ(B $BGK(B $BGL(B $BGM(B $BGN(B $BGO(B
+$BGP(B $BGQ(B $BGR(B $BGS(B $BGT(B $BGU(B $BGV(B $BGW(B $BGX(B $BGY(B $BGZ(B $BG[(B $BG\(B $BG](B $BG^(B $BG_(B
+$BG`(B $BGa(B $BGb(B $BGc(B $BGd(B $BGe(B $BGf(B $BGg(B $BGh(B $BGi(B $BGj(B $BGk(B $BGl(B $BGm(B $BGn(B $BGo(B
+$BGp(B $BGq(B $BGr(B $BGs(B $BGt(B $BGu(B $BGv(B $BGw(B $BGx(B $BGy(B $BGz(B $BG{(B $BG|(B $BG}(B $BG~(B
+   $BH!(B $BH"(B $BH#(B $BH$(B $BH%(B $BH&(B $BH'(B $BH((B $BH)(B $BH*(B $BH+(B $BH,(B $BH-(B $BH.(B $BH/(B
+$BH0(B $BH1(B $BH2(B $BH3(B $BH4(B $BH5(B $BH6(B $BH7(B $BH8(B $BH9(B $BH:(B $BH;(B $BH<(B $BH=(B $BH>(B $BH?(B
+$BH@(B $BHA(B $BHB(B $BHC(B $BHD(B $BHE(B $BHF(B $BHG(B $BHH(B $BHI(B $BHJ(B $BHK(B $BHL(B $BHM(B $BHN(B $BHO(B
+$BHP(B $BHQ(B $BHR(B $BHS(B $BHT(B $BHU(B $BHV(B $BHW(B $BHX(B $BHY(B $BHZ(B $BH[(B $BH\(B $BH](B $BH^(B $BH_(B
+$BH`(B $BHa(B $BHb(B $BHc(B $BHd(B $BHe(B $BHf(B $BHg(B $BHh(B $BHi(B $BHj(B $BHk(B $BHl(B $BHm(B $BHn(B $BHo(B
+$BHp(B $BHq(B $BHr(B $BHs(B $BHt(B $BHu(B $BHv(B $BHw(B $BHx(B $BHy(B $BHz(B $BH{(B $BH|(B $BH}(B $BH~(B
+   $BI!(B $BI"(B $BI#(B $BI$(B $BI%(B $BI&(B $BI'(B $BI((B $BI)(B $BI*(B $BI+(B $BI,(B $BI-(B $BI.(B $BI/(B
+$BI0(B $BI1(B $BI2(B $BI3(B $BI4(B $BI5(B $BI6(B $BI7(B $BI8(B $BI9(B $BI:(B $BI;(B $BI<(B $BI=(B $BI>(B $BI?(B
+$BI@(B $BIA(B $BIB(B $BIC(B $BID(B $BIE(B $BIF(B $BIG(B $BIH(B $BII(B $BIJ(B $BIK(B $BIL(B $BIM(B $BIN(B $BIO(B
+$BIP(B $BIQ(B $BIR(B $BIS(B $BIT(B $BIU(B $BIV(B $BIW(B $BIX(B $BIY(B $BIZ(B $BI[(B $BI\(B $BI](B $BI^(B $BI_(B
+$BI`(B $BIa(B $BIb(B $BIc(B $BId(B $BIe(B $BIf(B $BIg(B $BIh(B $BIi(B $BIj(B $BIk(B $BIl(B $BIm(B $BIn(B $BIo(B
+$BIp(B $BIq(B $BIr(B $BIs(B $BIt(B $BIu(B $BIv(B $BIw(B $BIx(B $BIy(B $BIz(B $BI{(B $BI|(B $BI}(B $BI~(B
+   $BJ!(B $BJ"(B $BJ#(B $BJ$(B $BJ%(B $BJ&(B $BJ'(B $BJ((B $BJ)(B $BJ*(B $BJ+(B $BJ,(B $BJ-(B $BJ.(B $BJ/(B
+$BJ0(B $BJ1(B $BJ2(B $BJ3(B $BJ4(B $BJ5(B $BJ6(B $BJ7(B $BJ8(B $BJ9(B $BJ:(B $BJ;(B $BJ<(B $BJ=(B $BJ>(B $BJ?(B
+$BJ@(B $BJA(B $BJB(B $BJC(B $BJD(B $BJE(B $BJF(B $BJG(B $BJH(B $BJI(B $BJJ(B $BJK(B $BJL(B $BJM(B $BJN(B $BJO(B
+$BJP(B $BJQ(B $BJR(B $BJS(B $BJT(B $BJU(B $BJV(B $BJW(B $BJX(B $BJY(B $BJZ(B $BJ[(B $BJ\(B $BJ](B $BJ^(B $BJ_(B
+$BJ`(B $BJa(B $BJb(B $BJc(B $BJd(B $BJe(B $BJf(B $BJg(B $BJh(B $BJi(B $BJj(B $BJk(B $BJl(B $BJm(B $BJn(B $BJo(B
+$BJp(B $BJq(B $BJr(B $BJs(B $BJt(B $BJu(B $BJv(B $BJw(B $BJx(B $BJy(B $BJz(B $BJ{(B $BJ|(B $BJ}(B $BJ~(B
+   $BK!(B $BK"(B $BK#(B $BK$(B $BK%(B $BK&(B $BK'(B $BK((B $BK)(B $BK*(B $BK+(B $BK,(B $BK-(B $BK.(B $BK/(B
+$BK0(B $BK1(B $BK2(B $BK3(B $BK4(B $BK5(B $BK6(B $BK7(B $BK8(B $BK9(B $BK:(B $BK;(B $BK<(B $BK=(B $BK>(B $BK?(B
+$BK@(B $BKA(B $BKB(B $BKC(B $BKD(B $BKE(B $BKF(B $BKG(B $BKH(B $BKI(B $BKJ(B $BKK(B $BKL(B $BKM(B $BKN(B $BKO(B
+$BKP(B $BKQ(B $BKR(B $BKS(B $BKT(B $BKU(B $BKV(B $BKW(B $BKX(B $BKY(B $BKZ(B $BK[(B $BK\(B $BK](B $BK^(B $BK_(B
+$BK`(B $BKa(B $BKb(B $BKc(B $BKd(B $BKe(B $BKf(B $BKg(B $BKh(B $BKi(B $BKj(B $BKk(B $BKl(B $BKm(B $BKn(B $BKo(B
+$BKp(B $BKq(B $BKr(B $BKs(B $BKt(B $BKu(B $BKv(B $BKw(B $BKx(B $BKy(B $BKz(B $BK{(B $BK|(B $BK}(B $BK~(B
+   $BL!(B $BL"(B $BL#(B $BL$(B $BL%(B $BL&(B $BL'(B $BL((B $BL)(B $BL*(B $BL+(B $BL,(B $BL-(B $BL.(B $BL/(B
+$BL0(B $BL1(B $BL2(B $BL3(B $BL4(B $BL5(B $BL6(B $BL7(B $BL8(B $BL9(B $BL:(B $BL;(B $BL<(B $BL=(B $BL>(B $BL?(B
+$BL@(B $BLA(B $BLB(B $BLC(B $BLD(B $BLE(B $BLF(B $BLG(B $BLH(B $BLI(B $BLJ(B $BLK(B $BLL(B $BLM(B $BLN(B $BLO(B
+$BLP(B $BLQ(B $BLR(B $BLS(B $BLT(B $BLU(B $BLV(B $BLW(B $BLX(B $BLY(B $BLZ(B $BL[(B $BL\(B $BL](B $BL^(B $BL_(B
+$BL`(B $BLa(B $BLb(B $BLc(B $BLd(B $BLe(B $BLf(B $BLg(B $BLh(B $BLi(B $BLj(B $BLk(B $BLl(B $BLm(B $BLn(B $BLo(B
+$BLp(B $BLq(B $BLr(B $BLs(B $BLt(B $BLu(B $BLv(B $BLw(B $BLx(B $BLy(B $BLz(B $BL{(B $BL|(B $BL}(B $BL~(B
+   $BM!(B $BM"(B $BM#(B $BM$(B $BM%(B $BM&(B $BM'(B $BM((B $BM)(B $BM*(B $BM+(B $BM,(B $BM-(B $BM.(B $BM/(B
+$BM0(B $BM1(B $BM2(B $BM3(B $BM4(B $BM5(B $BM6(B $BM7(B $BM8(B $BM9(B $BM:(B $BM;(B $BM<(B $BM=(B $BM>(B $BM?(B
+$BM@(B $BMA(B $BMB(B $BMC(B $BMD(B $BME(B $BMF(B $BMG(B $BMH(B $BMI(B $BMJ(B $BMK(B $BML(B $BMM(B $BMN(B $BMO(B
+$BMP(B $BMQ(B $BMR(B $BMS(B $BMT(B $BMU(B $BMV(B $BMW(B $BMX(B $BMY(B $BMZ(B $BM[(B $BM\(B $BM](B $BM^(B $BM_(B
+$BM`(B $BMa(B $BMb(B $BMc(B $BMd(B $BMe(B $BMf(B $BMg(B $BMh(B $BMi(B $BMj(B $BMk(B $BMl(B $BMm(B $BMn(B $BMo(B
+$BMp(B $BMq(B $BMr(B $BMs(B $BMt(B $BMu(B $BMv(B $BMw(B $BMx(B $BMy(B $BMz(B $BM{(B $BM|(B $BM}(B $BM~(B
+   $BN!(B $BN"(B $BN#(B $BN$(B $BN%(B $BN&(B $BN'(B $BN((B $BN)(B $BN*(B $BN+(B $BN,(B $BN-(B $BN.(B $BN/(B
+$BN0(B $BN1(B $BN2(B $BN3(B $BN4(B $BN5(B $BN6(B $BN7(B $BN8(B $BN9(B $BN:(B $BN;(B $BN<(B $BN=(B $BN>(B $BN?(B
+$BN@(B $BNA(B $BNB(B $BNC(B $BND(B $BNE(B $BNF(B $BNG(B $BNH(B $BNI(B $BNJ(B $BNK(B $BNL(B $BNM(B $BNN(B $BNO(B
+$BNP(B $BNQ(B $BNR(B $BNS(B $BNT(B $BNU(B $BNV(B $BNW(B $BNX(B $BNY(B $BNZ(B $BN[(B $BN\(B $BN](B $BN^(B $BN_(B
+$BN`(B $BNa(B $BNb(B $BNc(B $BNd(B $BNe(B $BNf(B $BNg(B $BNh(B $BNi(B $BNj(B $BNk(B $BNl(B $BNm(B $BNn(B $BNo(B
+$BNp(B $BNq(B $BNr(B $BNs(B $BNt(B $BNu(B $BNv(B $BNw(B $BNx(B $BNy(B $BNz(B $BN{(B $BN|(B $BN}(B $BN~(B
+   $BO!(B $BO"(B $BO#(B $BO$(B $BO%(B $BO&(B $BO'(B $BO((B $BO)(B $BO*(B $BO+(B $BO,(B $BO-(B $BO.(B $BO/(B
+$BO0(B $BO1(B $BO2(B $BO3(B $BO4(B $BO5(B $BO6(B $BO7(B $BO8(B $BO9(B $BO:(B $BO;(B $BO<(B $BO=(B $BO>(B $BO?(B
+$BO@(B $BOA(B $BOB(B $BOC(B $BOD(B $BOE(B $BOF(B $BOG(B $BOH(B $BOI(B $BOJ(B $BOK(B $BOL(B $BOM(B $BON(B $BOO(B
+$BOP(B $BOQ(B $BOR(B $BOS(B
+   $BP!(B $BP"(B $BP#(B $BP$(B $BP%(B $BP&(B $BP'(B $BP((B $BP)(B $BP*(B $BP+(B $BP,(B $BP-(B $BP.(B $BP/(B
+$BP0(B $BP1(B $BP2(B $BP3(B $BP4(B $BP5(B $BP6(B $BP7(B $BP8(B $BP9(B $BP:(B $BP;(B $BP<(B $BP=(B $BP>(B $BP?(B
+$BP@(B $BPA(B $BPB(B $BPC(B $BPD(B $BPE(B $BPF(B $BPG(B $BPH(B $BPI(B $BPJ(B $BPK(B $BPL(B $BPM(B $BPN(B $BPO(B
+$BPP(B $BPQ(B $BPR(B $BPS(B $BPT(B $BPU(B $BPV(B $BPW(B $BPX(B $BPY(B $BPZ(B $BP[(B $BP\(B $BP](B $BP^(B $BP_(B
+$BP`(B $BPa(B $BPb(B $BPc(B $BPd(B $BPe(B $BPf(B $BPg(B $BPh(B $BPi(B $BPj(B $BPk(B $BPl(B $BPm(B $BPn(B $BPo(B
+$BPp(B $BPq(B $BPr(B $BPs(B $BPt(B $BPu(B $BPv(B $BPw(B $BPx(B $BPy(B $BPz(B $BP{(B $BP|(B $BP}(B $BP~(B
+   $BQ!(B $BQ"(B $BQ#(B $BQ$(B $BQ%(B $BQ&(B $BQ'(B $BQ((B $BQ)(B $BQ*(B $BQ+(B $BQ,(B $BQ-(B $BQ.(B $BQ/(B
+$BQ0(B $BQ1(B $BQ2(B $BQ3(B $BQ4(B $BQ5(B $BQ6(B $BQ7(B $BQ8(B $BQ9(B $BQ:(B $BQ;(B $BQ<(B $BQ=(B $BQ>(B $BQ?(B
+$BQ@(B $BQA(B $BQB(B $BQC(B $BQD(B $BQE(B $BQF(B $BQG(B $BQH(B $BQI(B $BQJ(B $BQK(B $BQL(B $BQM(B $BQN(B $BQO(B
+$BQP(B $BQQ(B $BQR(B $BQS(B $BQT(B $BQU(B $BQV(B $BQW(B $BQX(B $BQY(B $BQZ(B $BQ[(B $BQ\(B $BQ](B $BQ^(B $BQ_(B
+$BQ`(B $BQa(B $BQb(B $BQc(B $BQd(B $BQe(B $BQf(B $BQg(B $BQh(B $BQi(B $BQj(B $BQk(B $BQl(B $BQm(B $BQn(B $BQo(B
+$BQp(B $BQq(B $BQr(B $BQs(B $BQt(B $BQu(B $BQv(B $BQw(B $BQx(B $BQy(B $BQz(B $BQ{(B $BQ|(B $BQ}(B $BQ~(B
+   $BR!(B $BR"(B $BR#(B $BR$(B $BR%(B $BR&(B $BR'(B $BR((B $BR)(B $BR*(B $BR+(B $BR,(B $BR-(B $BR.(B $BR/(B
+$BR0(B $BR1(B $BR2(B $BR3(B $BR4(B $BR5(B $BR6(B $BR7(B $BR8(B $BR9(B $BR:(B $BR;(B $BR<(B $BR=(B $BR>(B $BR?(B
+$BR@(B $BRA(B $BRB(B $BRC(B $BRD(B $BRE(B $BRF(B $BRG(B $BRH(B $BRI(B $BRJ(B $BRK(B $BRL(B $BRM(B $BRN(B $BRO(B
+$BRP(B $BRQ(B $BRR(B $BRS(B $BRT(B $BRU(B $BRV(B $BRW(B $BRX(B $BRY(B $BRZ(B $BR[(B $BR\(B $BR](B $BR^(B $BR_(B
+$BR`(B $BRa(B $BRb(B $BRc(B $BRd(B $BRe(B $BRf(B $BRg(B $BRh(B $BRi(B $BRj(B $BRk(B $BRl(B $BRm(B $BRn(B $BRo(B
+$BRp(B $BRq(B $BRr(B $BRs(B $BRt(B $BRu(B $BRv(B $BRw(B $BRx(B $BRy(B $BRz(B $BR{(B $BR|(B $BR}(B $BR~(B
+   $BS!(B $BS"(B $BS#(B $BS$(B $BS%(B $BS&(B $BS'(B $BS((B $BS)(B $BS*(B $BS+(B $BS,(B $BS-(B $BS.(B $BS/(B
+$BS0(B $BS1(B $BS2(B $BS3(B $BS4(B $BS5(B $BS6(B $BS7(B $BS8(B $BS9(B $BS:(B $BS;(B $BS<(B $BS=(B $BS>(B $BS?(B
+$BS@(B $BSA(B $BSB(B $BSC(B $BSD(B $BSE(B $BSF(B $BSG(B $BSH(B $BSI(B $BSJ(B $BSK(B $BSL(B $BSM(B $BSN(B $BSO(B
+$BSP(B $BSQ(B $BSR(B $BSS(B $BST(B $BSU(B $BSV(B $BSW(B $BSX(B $BSY(B $BSZ(B $BS[(B $BS\(B $BS](B $BS^(B $BS_(B
+$BS`(B $BSa(B $BSb(B $BSc(B $BSd(B $BSe(B $BSf(B $BSg(B $BSh(B $BSi(B $BSj(B $BSk(B $BSl(B $BSm(B $BSn(B $BSo(B
+$BSp(B $BSq(B $BSr(B $BSs(B $BSt(B $BSu(B $BSv(B $BSw(B $BSx(B $BSy(B $BSz(B $BS{(B $BS|(B $BS}(B $BS~(B
+   $BT!(B $BT"(B $BT#(B $BT$(B $BT%(B $BT&(B $BT'(B $BT((B $BT)(B $BT*(B $BT+(B $BT,(B $BT-(B $BT.(B $BT/(B
+$BT0(B $BT1(B $BT2(B $BT3(B $BT4(B $BT5(B $BT6(B $BT7(B $BT8(B $BT9(B $BT:(B $BT;(B $BT<(B $BT=(B $BT>(B $BT?(B
+$BT@(B $BTA(B $BTB(B $BTC(B $BTD(B $BTE(B $BTF(B $BTG(B $BTH(B $BTI(B $BTJ(B $BTK(B $BTL(B $BTM(B $BTN(B $BTO(B
+$BTP(B $BTQ(B $BTR(B $BTS(B $BTT(B $BTU(B $BTV(B $BTW(B $BTX(B $BTY(B $BTZ(B $BT[(B $BT\(B $BT](B $BT^(B $BT_(B
+$BT`(B $BTa(B $BTb(B $BTc(B $BTd(B $BTe(B $BTf(B $BTg(B $BTh(B $BTi(B $BTj(B $BTk(B $BTl(B $BTm(B $BTn(B $BTo(B
+$BTp(B $BTq(B $BTr(B $BTs(B $BTt(B $BTu(B $BTv(B $BTw(B $BTx(B $BTy(B $BTz(B $BT{(B $BT|(B $BT}(B $BT~(B
+   $BU!(B $BU"(B $BU#(B $BU$(B $BU%(B $BU&(B $BU'(B $BU((B $BU)(B $BU*(B $BU+(B $BU,(B $BU-(B $BU.(B $BU/(B
+$BU0(B $BU1(B $BU2(B $BU3(B $BU4(B $BU5(B $BU6(B $BU7(B $BU8(B $BU9(B $BU:(B $BU;(B $BU<(B $BU=(B $BU>(B $BU?(B
+$BU@(B $BUA(B $BUB(B $BUC(B $BUD(B $BUE(B $BUF(B $BUG(B $BUH(B $BUI(B $BUJ(B $BUK(B $BUL(B $BUM(B $BUN(B $BUO(B
+$BUP(B $BUQ(B $BUR(B $BUS(B $BUT(B $BUU(B $BUV(B $BUW(B $BUX(B $BUY(B $BUZ(B $BU[(B $BU\(B $BU](B $BU^(B $BU_(B
+$BU`(B $BUa(B $BUb(B $BUc(B $BUd(B $BUe(B $BUf(B $BUg(B $BUh(B $BUi(B $BUj(B $BUk(B $BUl(B $BUm(B $BUn(B $BUo(B
+$BUp(B $BUq(B $BUr(B $BUs(B $BUt(B $BUu(B $BUv(B $BUw(B $BUx(B $BUy(B $BUz(B $BU{(B $BU|(B $BU}(B $BU~(B
+   $BV!(B $BV"(B $BV#(B $BV$(B $BV%(B $BV&(B $BV'(B $BV((B $BV)(B $BV*(B $BV+(B $BV,(B $BV-(B $BV.(B $BV/(B
+$BV0(B $BV1(B $BV2(B $BV3(B $BV4(B $BV5(B $BV6(B $BV7(B $BV8(B $BV9(B $BV:(B $BV;(B $BV<(B $BV=(B $BV>(B $BV?(B
+$BV@(B $BVA(B $BVB(B $BVC(B $BVD(B $BVE(B $BVF(B $BVG(B $BVH(B $BVI(B $BVJ(B $BVK(B $BVL(B $BVM(B $BVN(B $BVO(B
+$BVP(B $BVQ(B $BVR(B $BVS(B $BVT(B $BVU(B $BVV(B $BVW(B $BVX(B $BVY(B $BVZ(B $BV[(B $BV\(B $BV](B $BV^(B $BV_(B
+$BV`(B $BVa(B $BVb(B $BVc(B $BVd(B $BVe(B $BVf(B $BVg(B $BVh(B $BVi(B $BVj(B $BVk(B $BVl(B $BVm(B $BVn(B $BVo(B
+$BVp(B $BVq(B $BVr(B $BVs(B $BVt(B $BVu(B $BVv(B $BVw(B $BVx(B $BVy(B $BVz(B $BV{(B $BV|(B $BV}(B $BV~(B
+   $BW!(B $BW"(B $BW#(B $BW$(B $BW%(B $BW&(B $BW'(B $BW((B $BW)(B $BW*(B $BW+(B $BW,(B $BW-(B $BW.(B $BW/(B
+$BW0(B $BW1(B $BW2(B $BW3(B $BW4(B $BW5(B $BW6(B $BW7(B $BW8(B $BW9(B $BW:(B $BW;(B $BW<(B $BW=(B $BW>(B $BW?(B
+$BW@(B $BWA(B $BWB(B $BWC(B $BWD(B $BWE(B $BWF(B $BWG(B $BWH(B $BWI(B $BWJ(B $BWK(B $BWL(B $BWM(B $BWN(B $BWO(B
+$BWP(B $BWQ(B $BWR(B $BWS(B $BWT(B $BWU(B $BWV(B $BWW(B $BWX(B $BWY(B $BWZ(B $BW[(B $BW\(B $BW](B $BW^(B $BW_(B
+$BW`(B $BWa(B $BWb(B $BWc(B $BWd(B $BWe(B $BWf(B $BWg(B $BWh(B $BWi(B $BWj(B $BWk(B $BWl(B $BWm(B $BWn(B $BWo(B
+$BWp(B $BWq(B $BWr(B $BWs(B $BWt(B $BWu(B $BWv(B $BWw(B $BWx(B $BWy(B $BWz(B $BW{(B $BW|(B $BW}(B $BW~(B
+   $BX!(B $BX"(B $BX#(B $BX$(B $BX%(B $BX&(B $BX'(B $BX((B $BX)(B $BX*(B $BX+(B $BX,(B $BX-(B $BX.(B $BX/(B
+$BX0(B $BX1(B $BX2(B $BX3(B $BX4(B $BX5(B $BX6(B $BX7(B $BX8(B $BX9(B $BX:(B $BX;(B $BX<(B $BX=(B $BX>(B $BX?(B
+$BX@(B $BXA(B $BXB(B $BXC(B $BXD(B $BXE(B $BXF(B $BXG(B $BXH(B $BXI(B $BXJ(B $BXK(B $BXL(B $BXM(B $BXN(B $BXO(B
+$BXP(B $BXQ(B $BXR(B $BXS(B $BXT(B $BXU(B $BXV(B $BXW(B $BXX(B $BXY(B $BXZ(B $BX[(B $BX\(B $BX](B $BX^(B $BX_(B
+$BX`(B $BXa(B $BXb(B $BXc(B $BXd(B $BXe(B $BXf(B $BXg(B $BXh(B $BXi(B $BXj(B $BXk(B $BXl(B $BXm(B $BXn(B $BXo(B
+$BXp(B $BXq(B $BXr(B $BXs(B $BXt(B $BXu(B $BXv(B $BXw(B $BXx(B $BXy(B $BXz(B $BX{(B $BX|(B $BX}(B $BX~(B
+   $BY!(B $BY"(B $BY#(B $BY$(B $BY%(B $BY&(B $BY'(B $BY((B $BY)(B $BY*(B $BY+(B $BY,(B $BY-(B $BY.(B $BY/(B
+$BY0(B $BY1(B $BY2(B $BY3(B $BY4(B $BY5(B $BY6(B $BY7(B $BY8(B $BY9(B $BY:(B $BY;(B $BY<(B $BY=(B $BY>(B $BY?(B
+$BY@(B $BYA(B $BYB(B $BYC(B $BYD(B $BYE(B $BYF(B $BYG(B $BYH(B $BYI(B $BYJ(B $BYK(B $BYL(B $BYM(B $BYN(B $BYO(B
+$BYP(B $BYQ(B $BYR(B $BYS(B $BYT(B $BYU(B $BYV(B $BYW(B $BYX(B $BYY(B $BYZ(B $BY[(B $BY\(B $BY](B $BY^(B $BY_(B
+$BY`(B $BYa(B $BYb(B $BYc(B $BYd(B $BYe(B $BYf(B $BYg(B $BYh(B $BYi(B $BYj(B $BYk(B $BYl(B $BYm(B $BYn(B $BYo(B
+$BYp(B $BYq(B $BYr(B $BYs(B $BYt(B $BYu(B $BYv(B $BYw(B $BYx(B $BYy(B $BYz(B $BY{(B $BY|(B $BY}(B $BY~(B
+   $BZ!(B $BZ"(B $BZ#(B $BZ$(B $BZ%(B $BZ&(B $BZ'(B $BZ((B $BZ)(B $BZ*(B $BZ+(B $BZ,(B $BZ-(B $BZ.(B $BZ/(B
+$BZ0(B $BZ1(B $BZ2(B $BZ3(B $BZ4(B $BZ5(B $BZ6(B $BZ7(B $BZ8(B $BZ9(B $BZ:(B $BZ;(B $BZ<(B $BZ=(B $BZ>(B $BZ?(B
+$BZ@(B $BZA(B $BZB(B $BZC(B $BZD(B $BZE(B $BZF(B $BZG(B $BZH(B $BZI(B $BZJ(B $BZK(B $BZL(B $BZM(B $BZN(B $BZO(B
+$BZP(B $BZQ(B $BZR(B $BZS(B $BZT(B $BZU(B $BZV(B $BZW(B $BZX(B $BZY(B $BZZ(B $BZ[(B $BZ\(B $BZ](B $BZ^(B $BZ_(B
+$BZ`(B $BZa(B $BZb(B $BZc(B $BZd(B $BZe(B $BZf(B $BZg(B $BZh(B $BZi(B $BZj(B $BZk(B $BZl(B $BZm(B $BZn(B $BZo(B
+$BZp(B $BZq(B $BZr(B $BZs(B $BZt(B $BZu(B $BZv(B $BZw(B $BZx(B $BZy(B $BZz(B $BZ{(B $BZ|(B $BZ}(B $BZ~(B
+   $B[!(B $B["(B $B[#(B $B[$(B $B[%(B $B[&(B $B['(B $B[((B $B[)(B $B[*(B $B[+(B $B[,(B $B[-(B $B[.(B $B[/(B
+$B[0(B $B[1(B $B[2(B $B[3(B $B[4(B $B[5(B $B[6(B $B[7(B $B[8(B $B[9(B $B[:(B $B[;(B $B[<(B $B[=(B $B[>(B $B[?(B
+$B[@(B $B[A(B $B[B(B $B[C(B $B[D(B $B[E(B $B[F(B $B[G(B $B[H(B $B[I(B $B[J(B $B[K(B $B[L(B $B[M(B $B[N(B $B[O(B
+$B[P(B $B[Q(B $B[R(B $B[S(B $B[T(B $B[U(B $B[V(B $B[W(B $B[X(B $B[Y(B $B[Z(B $B[[(B $B[\(B $B[](B $B[^(B $B[_(B
+$B[`(B $B[a(B $B[b(B $B[c(B $B[d(B $B[e(B $B[f(B $B[g(B $B[h(B $B[i(B $B[j(B $B[k(B $B[l(B $B[m(B $B[n(B $B[o(B
+$B[p(B $B[q(B $B[r(B $B[s(B $B[t(B $B[u(B $B[v(B $B[w(B $B[x(B $B[y(B $B[z(B $B[{(B $B[|(B $B[}(B $B[~(B
+   $B\!(B $B\"(B $B\#(B $B\$(B $B\%(B $B\&(B $B\'(B $B\((B $B\)(B $B\*(B $B\+(B $B\,(B $B\-(B $B\.(B $B\/(B
+$B\0(B $B\1(B $B\2(B $B\3(B $B\4(B $B\5(B $B\6(B $B\7(B $B\8(B $B\9(B $B\:(B $B\;(B $B\<(B $B\=(B $B\>(B $B\?(B
+$B\@(B $B\A(B $B\B(B $B\C(B $B\D(B $B\E(B $B\F(B $B\G(B $B\H(B $B\I(B $B\J(B $B\K(B $B\L(B $B\M(B $B\N(B $B\O(B
+$B\P(B $B\Q(B $B\R(B $B\S(B $B\T(B $B\U(B $B\V(B $B\W(B $B\X(B $B\Y(B $B\Z(B $B\[(B $B\\(B $B\](B $B\^(B $B\_(B
+$B\`(B $B\a(B $B\b(B $B\c(B $B\d(B $B\e(B $B\f(B $B\g(B $B\h(B $B\i(B $B\j(B $B\k(B $B\l(B $B\m(B $B\n(B $B\o(B
+$B\p(B $B\q(B $B\r(B $B\s(B $B\t(B $B\u(B $B\v(B $B\w(B $B\x(B $B\y(B $B\z(B $B\{(B $B\|(B $B\}(B $B\~(B
+   $B]!(B $B]"(B $B]#(B $B]$(B $B]%(B $B]&(B $B]'(B $B]((B $B])(B $B]*(B $B]+(B $B],(B $B]-(B $B].(B $B]/(B
+$B]0(B $B]1(B $B]2(B $B]3(B $B]4(B $B]5(B $B]6(B $B]7(B $B]8(B $B]9(B $B]:(B $B];(B $B]<(B $B]=(B $B]>(B $B]?(B
+$B]@(B $B]A(B $B]B(B $B]C(B $B]D(B $B]E(B $B]F(B $B]G(B $B]H(B $B]I(B $B]J(B $B]K(B $B]L(B $B]M(B $B]N(B $B]O(B
+$B]P(B $B]Q(B $B]R(B $B]S(B $B]T(B $B]U(B $B]V(B $B]W(B $B]X(B $B]Y(B $B]Z(B $B][(B $B]\(B $B]](B $B]^(B $B]_(B
+$B]`(B $B]a(B $B]b(B $B]c(B $B]d(B $B]e(B $B]f(B $B]g(B $B]h(B $B]i(B $B]j(B $B]k(B $B]l(B $B]m(B $B]n(B $B]o(B
+$B]p(B $B]q(B $B]r(B $B]s(B $B]t(B $B]u(B $B]v(B $B]w(B $B]x(B $B]y(B $B]z(B $B]{(B $B]|(B $B]}(B $B]~(B
+   $B^!(B $B^"(B $B^#(B $B^$(B $B^%(B $B^&(B $B^'(B $B^((B $B^)(B $B^*(B $B^+(B $B^,(B $B^-(B $B^.(B $B^/(B
+$B^0(B $B^1(B $B^2(B $B^3(B $B^4(B $B^5(B $B^6(B $B^7(B $B^8(B $B^9(B $B^:(B $B^;(B $B^<(B $B^=(B $B^>(B $B^?(B
+$B^@(B $B^A(B $B^B(B $B^C(B $B^D(B $B^E(B $B^F(B $B^G(B $B^H(B $B^I(B $B^J(B $B^K(B $B^L(B $B^M(B $B^N(B $B^O(B
+$B^P(B $B^Q(B $B^R(B $B^S(B $B^T(B $B^U(B $B^V(B $B^W(B $B^X(B $B^Y(B $B^Z(B $B^[(B $B^\(B $B^](B $B^^(B $B^_(B
+$B^`(B $B^a(B $B^b(B $B^c(B $B^d(B $B^e(B $B^f(B $B^g(B $B^h(B $B^i(B $B^j(B $B^k(B $B^l(B $B^m(B $B^n(B $B^o(B
+$B^p(B $B^q(B $B^r(B $B^s(B $B^t(B $B^u(B $B^v(B $B^w(B $B^x(B $B^y(B $B^z(B $B^{(B $B^|(B $B^}(B $B^~(B
+   $B_!(B $B_"(B $B_#(B $B_$(B $B_%(B $B_&(B $B_'(B $B_((B $B_)(B $B_*(B $B_+(B $B_,(B $B_-(B $B_.(B $B_/(B
+$B_0(B $B_1(B $B_2(B $B_3(B $B_4(B $B_5(B $B_6(B $B_7(B $B_8(B $B_9(B $B_:(B $B_;(B $B_<(B $B_=(B $B_>(B $B_?(B
+$B_@(B $B_A(B $B_B(B $B_C(B $B_D(B $B_E(B $B_F(B $B_G(B $B_H(B $B_I(B $B_J(B $B_K(B $B_L(B $B_M(B $B_N(B $B_O(B
+$B_P(B $B_Q(B $B_R(B $B_S(B $B_T(B $B_U(B $B_V(B $B_W(B $B_X(B $B_Y(B $B_Z(B $B_[(B $B_\(B $B_](B $B_^(B $B__(B
+$B_`(B $B_a(B $B_b(B $B_c(B $B_d(B $B_e(B $B_f(B $B_g(B $B_h(B $B_i(B $B_j(B $B_k(B $B_l(B $B_m(B $B_n(B $B_o(B
+$B_p(B $B_q(B $B_r(B $B_s(B $B_t(B $B_u(B $B_v(B $B_w(B $B_x(B $B_y(B $B_z(B $B_{(B $B_|(B $B_}(B $B_~(B
+   $B`!(B $B`"(B $B`#(B $B`$(B $B`%(B $B`&(B $B`'(B $B`((B $B`)(B $B`*(B $B`+(B $B`,(B $B`-(B $B`.(B $B`/(B
+$B`0(B $B`1(B $B`2(B $B`3(B $B`4(B $B`5(B $B`6(B $B`7(B $B`8(B $B`9(B $B`:(B $B`;(B $B`<(B $B`=(B $B`>(B $B`?(B
+$B`@(B $B`A(B $B`B(B $B`C(B $B`D(B $B`E(B $B`F(B $B`G(B $B`H(B $B`I(B $B`J(B $B`K(B $B`L(B $B`M(B $B`N(B $B`O(B
+$B`P(B $B`Q(B $B`R(B $B`S(B $B`T(B $B`U(B $B`V(B $B`W(B $B`X(B $B`Y(B $B`Z(B $B`[(B $B`\(B $B`](B $B`^(B $B`_(B
+$B``(B $B`a(B $B`b(B $B`c(B $B`d(B $B`e(B $B`f(B $B`g(B $B`h(B $B`i(B $B`j(B $B`k(B $B`l(B $B`m(B $B`n(B $B`o(B
+$B`p(B $B`q(B $B`r(B $B`s(B $B`t(B $B`u(B $B`v(B $B`w(B $B`x(B $B`y(B $B`z(B $B`{(B $B`|(B $B`}(B $B`~(B
+   $Ba!(B $Ba"(B $Ba#(B $Ba$(B $Ba%(B $Ba&(B $Ba'(B $Ba((B $Ba)(B $Ba*(B $Ba+(B $Ba,(B $Ba-(B $Ba.(B $Ba/(B
+$Ba0(B $Ba1(B $Ba2(B $Ba3(B $Ba4(B $Ba5(B $Ba6(B $Ba7(B $Ba8(B $Ba9(B $Ba:(B $Ba;(B $Ba<(B $Ba=(B $Ba>(B $Ba?(B
+$Ba@(B $BaA(B $BaB(B $BaC(B $BaD(B $BaE(B $BaF(B $BaG(B $BaH(B $BaI(B $BaJ(B $BaK(B $BaL(B $BaM(B $BaN(B $BaO(B
+$BaP(B $BaQ(B $BaR(B $BaS(B $BaT(B $BaU(B $BaV(B $BaW(B $BaX(B $BaY(B $BaZ(B $Ba[(B $Ba\(B $Ba](B $Ba^(B $Ba_(B
+$Ba`(B $Baa(B $Bab(B $Bac(B $Bad(B $Bae(B $Baf(B $Bag(B $Bah(B $Bai(B $Baj(B $Bak(B $Bal(B $Bam(B $Ban(B $Bao(B
+$Bap(B $Baq(B $Bar(B $Bas(B $Bat(B $Bau(B $Bav(B $Baw(B $Bax(B $Bay(B $Baz(B $Ba{(B $Ba|(B $Ba}(B $Ba~(B
+   $Bb!(B $Bb"(B $Bb#(B $Bb$(B $Bb%(B $Bb&(B $Bb'(B $Bb((B $Bb)(B $Bb*(B $Bb+(B $Bb,(B $Bb-(B $Bb.(B $Bb/(B
+$Bb0(B $Bb1(B $Bb2(B $Bb3(B $Bb4(B $Bb5(B $Bb6(B $Bb7(B $Bb8(B $Bb9(B $Bb:(B $Bb;(B $Bb<(B $Bb=(B $Bb>(B $Bb?(B
+$Bb@(B $BbA(B $BbB(B $BbC(B $BbD(B $BbE(B $BbF(B $BbG(B $BbH(B $BbI(B $BbJ(B $BbK(B $BbL(B $BbM(B $BbN(B $BbO(B
+$BbP(B $BbQ(B $BbR(B $BbS(B $BbT(B $BbU(B $BbV(B $BbW(B $BbX(B $BbY(B $BbZ(B $Bb[(B $Bb\(B $Bb](B $Bb^(B $Bb_(B
+$Bb`(B $Bba(B $Bbb(B $Bbc(B $Bbd(B $Bbe(B $Bbf(B $Bbg(B $Bbh(B $Bbi(B $Bbj(B $Bbk(B $Bbl(B $Bbm(B $Bbn(B $Bbo(B
+$Bbp(B $Bbq(B $Bbr(B $Bbs(B $Bbt(B $Bbu(B $Bbv(B $Bbw(B $Bbx(B $Bby(B $Bbz(B $Bb{(B $Bb|(B $Bb}(B $Bb~(B
+   $Bc!(B $Bc"(B $Bc#(B $Bc$(B $Bc%(B $Bc&(B $Bc'(B $Bc((B $Bc)(B $Bc*(B $Bc+(B $Bc,(B $Bc-(B $Bc.(B $Bc/(B
+$Bc0(B $Bc1(B $Bc2(B $Bc3(B $Bc4(B $Bc5(B $Bc6(B $Bc7(B $Bc8(B $Bc9(B $Bc:(B $Bc;(B $Bc<(B $Bc=(B $Bc>(B $Bc?(B
+$Bc@(B $BcA(B $BcB(B $BcC(B $BcD(B $BcE(B $BcF(B $BcG(B $BcH(B $BcI(B $BcJ(B $BcK(B $BcL(B $BcM(B $BcN(B $BcO(B
+$BcP(B $BcQ(B $BcR(B $BcS(B $BcT(B $BcU(B $BcV(B $BcW(B $BcX(B $BcY(B $BcZ(B $Bc[(B $Bc\(B $Bc](B $Bc^(B $Bc_(B
+$Bc`(B $Bca(B $Bcb(B $Bcc(B $Bcd(B $Bce(B $Bcf(B $Bcg(B $Bch(B $Bci(B $Bcj(B $Bck(B $Bcl(B $Bcm(B $Bcn(B $Bco(B
+$Bcp(B $Bcq(B $Bcr(B $Bcs(B $Bct(B $Bcu(B $Bcv(B $Bcw(B $Bcx(B $Bcy(B $Bcz(B $Bc{(B $Bc|(B $Bc}(B $Bc~(B
+   $Bd!(B $Bd"(B $Bd#(B $Bd$(B $Bd%(B $Bd&(B $Bd'(B $Bd((B $Bd)(B $Bd*(B $Bd+(B $Bd,(B $Bd-(B $Bd.(B $Bd/(B
+$Bd0(B $Bd1(B $Bd2(B $Bd3(B $Bd4(B $Bd5(B $Bd6(B $Bd7(B $Bd8(B $Bd9(B $Bd:(B $Bd;(B $Bd<(B $Bd=(B $Bd>(B $Bd?(B
+$Bd@(B $BdA(B $BdB(B $BdC(B $BdD(B $BdE(B $BdF(B $BdG(B $BdH(B $BdI(B $BdJ(B $BdK(B $BdL(B $BdM(B $BdN(B $BdO(B
+$BdP(B $BdQ(B $BdR(B $BdS(B $BdT(B $BdU(B $BdV(B $BdW(B $BdX(B $BdY(B $BdZ(B $Bd[(B $Bd\(B $Bd](B $Bd^(B $Bd_(B
+$Bd`(B $Bda(B $Bdb(B $Bdc(B $Bdd(B $Bde(B $Bdf(B $Bdg(B $Bdh(B $Bdi(B $Bdj(B $Bdk(B $Bdl(B $Bdm(B $Bdn(B $Bdo(B
+$Bdp(B $Bdq(B $Bdr(B $Bds(B $Bdt(B $Bdu(B $Bdv(B $Bdw(B $Bdx(B $Bdy(B $Bdz(B $Bd{(B $Bd|(B $Bd}(B $Bd~(B
+   $Be!(B $Be"(B $Be#(B $Be$(B $Be%(B $Be&(B $Be'(B $Be((B $Be)(B $Be*(B $Be+(B $Be,(B $Be-(B $Be.(B $Be/(B
+$Be0(B $Be1(B $Be2(B $Be3(B $Be4(B $Be5(B $Be6(B $Be7(B $Be8(B $Be9(B $Be:(B $Be;(B $Be<(B $Be=(B $Be>(B $Be?(B
+$Be@(B $BeA(B $BeB(B $BeC(B $BeD(B $BeE(B $BeF(B $BeG(B $BeH(B $BeI(B $BeJ(B $BeK(B $BeL(B $BeM(B $BeN(B $BeO(B
+$BeP(B $BeQ(B $BeR(B $BeS(B $BeT(B $BeU(B $BeV(B $BeW(B $BeX(B $BeY(B $BeZ(B $Be[(B $Be\(B $Be](B $Be^(B $Be_(B
+$Be`(B $Bea(B $Beb(B $Bec(B $Bed(B $Bee(B $Bef(B $Beg(B $Beh(B $Bei(B $Bej(B $Bek(B $Bel(B $Bem(B $Ben(B $Beo(B
+$Bep(B $Beq(B $Ber(B $Bes(B $Bet(B $Beu(B $Bev(B $Bew(B $Bex(B $Bey(B $Bez(B $Be{(B $Be|(B $Be}(B $Be~(B
+   $Bf!(B $Bf"(B $Bf#(B $Bf$(B $Bf%(B $Bf&(B $Bf'(B $Bf((B $Bf)(B $Bf*(B $Bf+(B $Bf,(B $Bf-(B $Bf.(B $Bf/(B
+$Bf0(B $Bf1(B $Bf2(B $Bf3(B $Bf4(B $Bf5(B $Bf6(B $Bf7(B $Bf8(B $Bf9(B $Bf:(B $Bf;(B $Bf<(B $Bf=(B $Bf>(B $Bf?(B
+$Bf@(B $BfA(B $BfB(B $BfC(B $BfD(B $BfE(B $BfF(B $BfG(B $BfH(B $BfI(B $BfJ(B $BfK(B $BfL(B $BfM(B $BfN(B $BfO(B
+$BfP(B $BfQ(B $BfR(B $BfS(B $BfT(B $BfU(B $BfV(B $BfW(B $BfX(B $BfY(B $BfZ(B $Bf[(B $Bf\(B $Bf](B $Bf^(B $Bf_(B
+$Bf`(B $Bfa(B $Bfb(B $Bfc(B $Bfd(B $Bfe(B $Bff(B $Bfg(B $Bfh(B $Bfi(B $Bfj(B $Bfk(B $Bfl(B $Bfm(B $Bfn(B $Bfo(B
+$Bfp(B $Bfq(B $Bfr(B $Bfs(B $Bft(B $Bfu(B $Bfv(B $Bfw(B $Bfx(B $Bfy(B $Bfz(B $Bf{(B $Bf|(B $Bf}(B $Bf~(B
+   $Bg!(B $Bg"(B $Bg#(B $Bg$(B $Bg%(B $Bg&(B $Bg'(B $Bg((B $Bg)(B $Bg*(B $Bg+(B $Bg,(B $Bg-(B $Bg.(B $Bg/(B
+$Bg0(B $Bg1(B $Bg2(B $Bg3(B $Bg4(B $Bg5(B $Bg6(B $Bg7(B $Bg8(B $Bg9(B $Bg:(B $Bg;(B $Bg<(B $Bg=(B $Bg>(B $Bg?(B
+$Bg@(B $BgA(B $BgB(B $BgC(B $BgD(B $BgE(B $BgF(B $BgG(B $BgH(B $BgI(B $BgJ(B $BgK(B $BgL(B $BgM(B $BgN(B $BgO(B
+$BgP(B $BgQ(B $BgR(B $BgS(B $BgT(B $BgU(B $BgV(B $BgW(B $BgX(B $BgY(B $BgZ(B $Bg[(B $Bg\(B $Bg](B $Bg^(B $Bg_(B
+$Bg`(B $Bga(B $Bgb(B $Bgc(B $Bgd(B $Bge(B $Bgf(B $Bgg(B $Bgh(B $Bgi(B $Bgj(B $Bgk(B $Bgl(B $Bgm(B $Bgn(B $Bgo(B
+$Bgp(B $Bgq(B $Bgr(B $Bgs(B $Bgt(B $Bgu(B $Bgv(B $Bgw(B $Bgx(B $Bgy(B $Bgz(B $Bg{(B $Bg|(B $Bg}(B $Bg~(B
+   $Bh!(B $Bh"(B $Bh#(B $Bh$(B $Bh%(B $Bh&(B $Bh'(B $Bh((B $Bh)(B $Bh*(B $Bh+(B $Bh,(B $Bh-(B $Bh.(B $Bh/(B
+$Bh0(B $Bh1(B $Bh2(B $Bh3(B $Bh4(B $Bh5(B $Bh6(B $Bh7(B $Bh8(B $Bh9(B $Bh:(B $Bh;(B $Bh<(B $Bh=(B $Bh>(B $Bh?(B
+$Bh@(B $BhA(B $BhB(B $BhC(B $BhD(B $BhE(B $BhF(B $BhG(B $BhH(B $BhI(B $BhJ(B $BhK(B $BhL(B $BhM(B $BhN(B $BhO(B
+$BhP(B $BhQ(B $BhR(B $BhS(B $BhT(B $BhU(B $BhV(B $BhW(B $BhX(B $BhY(B $BhZ(B $Bh[(B $Bh\(B $Bh](B $Bh^(B $Bh_(B
+$Bh`(B $Bha(B $Bhb(B $Bhc(B $Bhd(B $Bhe(B $Bhf(B $Bhg(B $Bhh(B $Bhi(B $Bhj(B $Bhk(B $Bhl(B $Bhm(B $Bhn(B $Bho(B
+$Bhp(B $Bhq(B $Bhr(B $Bhs(B $Bht(B $Bhu(B $Bhv(B $Bhw(B $Bhx(B $Bhy(B $Bhz(B $Bh{(B $Bh|(B $Bh}(B $Bh~(B
+   $Bi!(B $Bi"(B $Bi#(B $Bi$(B $Bi%(B $Bi&(B $Bi'(B $Bi((B $Bi)(B $Bi*(B $Bi+(B $Bi,(B $Bi-(B $Bi.(B $Bi/(B
+$Bi0(B $Bi1(B $Bi2(B $Bi3(B $Bi4(B $Bi5(B $Bi6(B $Bi7(B $Bi8(B $Bi9(B $Bi:(B $Bi;(B $Bi<(B $Bi=(B $Bi>(B $Bi?(B
+$Bi@(B $BiA(B $BiB(B $BiC(B $BiD(B $BiE(B $BiF(B $BiG(B $BiH(B $BiI(B $BiJ(B $BiK(B $BiL(B $BiM(B $BiN(B $BiO(B
+$BiP(B $BiQ(B $BiR(B $BiS(B $BiT(B $BiU(B $BiV(B $BiW(B $BiX(B $BiY(B $BiZ(B $Bi[(B $Bi\(B $Bi](B $Bi^(B $Bi_(B
+$Bi`(B $Bia(B $Bib(B $Bic(B $Bid(B $Bie(B $Bif(B $Big(B $Bih(B $Bii(B $Bij(B $Bik(B $Bil(B $Bim(B $Bin(B $Bio(B
+$Bip(B $Biq(B $Bir(B $Bis(B $Bit(B $Biu(B $Biv(B $Biw(B $Bix(B $Biy(B $Biz(B $Bi{(B $Bi|(B $Bi}(B $Bi~(B
+   $Bj!(B $Bj"(B $Bj#(B $Bj$(B $Bj%(B $Bj&(B $Bj'(B $Bj((B $Bj)(B $Bj*(B $Bj+(B $Bj,(B $Bj-(B $Bj.(B $Bj/(B
+$Bj0(B $Bj1(B $Bj2(B $Bj3(B $Bj4(B $Bj5(B $Bj6(B $Bj7(B $Bj8(B $Bj9(B $Bj:(B $Bj;(B $Bj<(B $Bj=(B $Bj>(B $Bj?(B
+$Bj@(B $BjA(B $BjB(B $BjC(B $BjD(B $BjE(B $BjF(B $BjG(B $BjH(B $BjI(B $BjJ(B $BjK(B $BjL(B $BjM(B $BjN(B $BjO(B
+$BjP(B $BjQ(B $BjR(B $BjS(B $BjT(B $BjU(B $BjV(B $BjW(B $BjX(B $BjY(B $BjZ(B $Bj[(B $Bj\(B $Bj](B $Bj^(B $Bj_(B
+$Bj`(B $Bja(B $Bjb(B $Bjc(B $Bjd(B $Bje(B $Bjf(B $Bjg(B $Bjh(B $Bji(B $Bjj(B $Bjk(B $Bjl(B $Bjm(B $Bjn(B $Bjo(B
+$Bjp(B $Bjq(B $Bjr(B $Bjs(B $Bjt(B $Bju(B $Bjv(B $Bjw(B $Bjx(B $Bjy(B $Bjz(B $Bj{(B $Bj|(B $Bj}(B $Bj~(B
+   $Bk!(B $Bk"(B $Bk#(B $Bk$(B $Bk%(B $Bk&(B $Bk'(B $Bk((B $Bk)(B $Bk*(B $Bk+(B $Bk,(B $Bk-(B $Bk.(B $Bk/(B
+$Bk0(B $Bk1(B $Bk2(B $Bk3(B $Bk4(B $Bk5(B $Bk6(B $Bk7(B $Bk8(B $Bk9(B $Bk:(B $Bk;(B $Bk<(B $Bk=(B $Bk>(B $Bk?(B
+$Bk@(B $BkA(B $BkB(B $BkC(B $BkD(B $BkE(B $BkF(B $BkG(B $BkH(B $BkI(B $BkJ(B $BkK(B $BkL(B $BkM(B $BkN(B $BkO(B
+$BkP(B $BkQ(B $BkR(B $BkS(B $BkT(B $BkU(B $BkV(B $BkW(B $BkX(B $BkY(B $BkZ(B $Bk[(B $Bk\(B $Bk](B $Bk^(B $Bk_(B
+$Bk`(B $Bka(B $Bkb(B $Bkc(B $Bkd(B $Bke(B $Bkf(B $Bkg(B $Bkh(B $Bki(B $Bkj(B $Bkk(B $Bkl(B $Bkm(B $Bkn(B $Bko(B
+$Bkp(B $Bkq(B $Bkr(B $Bks(B $Bkt(B $Bku(B $Bkv(B $Bkw(B $Bkx(B $Bky(B $Bkz(B $Bk{(B $Bk|(B $Bk}(B $Bk~(B
+   $Bl!(B $Bl"(B $Bl#(B $Bl$(B $Bl%(B $Bl&(B $Bl'(B $Bl((B $Bl)(B $Bl*(B $Bl+(B $Bl,(B $Bl-(B $Bl.(B $Bl/(B
+$Bl0(B $Bl1(B $Bl2(B $Bl3(B $Bl4(B $Bl5(B $Bl6(B $Bl7(B $Bl8(B $Bl9(B $Bl:(B $Bl;(B $Bl<(B $Bl=(B $Bl>(B $Bl?(B
+$Bl@(B $BlA(B $BlB(B $BlC(B $BlD(B $BlE(B $BlF(B $BlG(B $BlH(B $BlI(B $BlJ(B $BlK(B $BlL(B $BlM(B $BlN(B $BlO(B
+$BlP(B $BlQ(B $BlR(B $BlS(B $BlT(B $BlU(B $BlV(B $BlW(B $BlX(B $BlY(B $BlZ(B $Bl[(B $Bl\(B $Bl](B $Bl^(B $Bl_(B
+$Bl`(B $Bla(B $Blb(B $Blc(B $Bld(B $Ble(B $Blf(B $Blg(B $Blh(B $Bli(B $Blj(B $Blk(B $Bll(B $Blm(B $Bln(B $Blo(B
+$Blp(B $Blq(B $Blr(B $Bls(B $Blt(B $Blu(B $Blv(B $Blw(B $Blx(B $Bly(B $Blz(B $Bl{(B $Bl|(B $Bl}(B $Bl~(B
+   $Bm!(B $Bm"(B $Bm#(B $Bm$(B $Bm%(B $Bm&(B $Bm'(B $Bm((B $Bm)(B $Bm*(B $Bm+(B $Bm,(B $Bm-(B $Bm.(B $Bm/(B
+$Bm0(B $Bm1(B $Bm2(B $Bm3(B $Bm4(B $Bm5(B $Bm6(B $Bm7(B $Bm8(B $Bm9(B $Bm:(B $Bm;(B $Bm<(B $Bm=(B $Bm>(B $Bm?(B
+$Bm@(B $BmA(B $BmB(B $BmC(B $BmD(B $BmE(B $BmF(B $BmG(B $BmH(B $BmI(B $BmJ(B $BmK(B $BmL(B $BmM(B $BmN(B $BmO(B
+$BmP(B $BmQ(B $BmR(B $BmS(B $BmT(B $BmU(B $BmV(B $BmW(B $BmX(B $BmY(B $BmZ(B $Bm[(B $Bm\(B $Bm](B $Bm^(B $Bm_(B
+$Bm`(B $Bma(B $Bmb(B $Bmc(B $Bmd(B $Bme(B $Bmf(B $Bmg(B $Bmh(B $Bmi(B $Bmj(B $Bmk(B $Bml(B $Bmm(B $Bmn(B $Bmo(B
+$Bmp(B $Bmq(B $Bmr(B $Bms(B $Bmt(B $Bmu(B $Bmv(B $Bmw(B $Bmx(B $Bmy(B $Bmz(B $Bm{(B $Bm|(B $Bm}(B $Bm~(B
+   $Bn!(B $Bn"(B $Bn#(B $Bn$(B $Bn%(B $Bn&(B $Bn'(B $Bn((B $Bn)(B $Bn*(B $Bn+(B $Bn,(B $Bn-(B $Bn.(B $Bn/(B
+$Bn0(B $Bn1(B $Bn2(B $Bn3(B $Bn4(B $Bn5(B $Bn6(B $Bn7(B $Bn8(B $Bn9(B $Bn:(B $Bn;(B $Bn<(B $Bn=(B $Bn>(B $Bn?(B
+$Bn@(B $BnA(B $BnB(B $BnC(B $BnD(B $BnE(B $BnF(B $BnG(B $BnH(B $BnI(B $BnJ(B $BnK(B $BnL(B $BnM(B $BnN(B $BnO(B
+$BnP(B $BnQ(B $BnR(B $BnS(B $BnT(B $BnU(B $BnV(B $BnW(B $BnX(B $BnY(B $BnZ(B $Bn[(B $Bn\(B $Bn](B $Bn^(B $Bn_(B
+$Bn`(B $Bna(B $Bnb(B $Bnc(B $Bnd(B $Bne(B $Bnf(B $Bng(B $Bnh(B $Bni(B $Bnj(B $Bnk(B $Bnl(B $Bnm(B $Bnn(B $Bno(B
+$Bnp(B $Bnq(B $Bnr(B $Bns(B $Bnt(B $Bnu(B $Bnv(B $Bnw(B $Bnx(B $Bny(B $Bnz(B $Bn{(B $Bn|(B $Bn}(B $Bn~(B
+   $Bo!(B $Bo"(B $Bo#(B $Bo$(B $Bo%(B $Bo&(B $Bo'(B $Bo((B $Bo)(B $Bo*(B $Bo+(B $Bo,(B $Bo-(B $Bo.(B $Bo/(B
+$Bo0(B $Bo1(B $Bo2(B $Bo3(B $Bo4(B $Bo5(B $Bo6(B $Bo7(B $Bo8(B $Bo9(B $Bo:(B $Bo;(B $Bo<(B $Bo=(B $Bo>(B $Bo?(B
+$Bo@(B $BoA(B $BoB(B $BoC(B $BoD(B $BoE(B $BoF(B $BoG(B $BoH(B $BoI(B $BoJ(B $BoK(B $BoL(B $BoM(B $BoN(B $BoO(B
+$BoP(B $BoQ(B $BoR(B $BoS(B $BoT(B $BoU(B $BoV(B $BoW(B $BoX(B $BoY(B $BoZ(B $Bo[(B $Bo\(B $Bo](B $Bo^(B $Bo_(B
+$Bo`(B $Boa(B $Bob(B $Boc(B $Bod(B $Boe(B $Bof(B $Bog(B $Boh(B $Boi(B $Boj(B $Bok(B $Bol(B $Bom(B $Bon(B $Boo(B
+$Bop(B $Boq(B $Bor(B $Bos(B $Bot(B $Bou(B $Bov(B $Bow(B $Box(B $Boy(B $Boz(B $Bo{(B $Bo|(B $Bo}(B $Bo~(B
+   $Bp!(B $Bp"(B $Bp#(B $Bp$(B $Bp%(B $Bp&(B $Bp'(B $Bp((B $Bp)(B $Bp*(B $Bp+(B $Bp,(B $Bp-(B $Bp.(B $Bp/(B
+$Bp0(B $Bp1(B $Bp2(B $Bp3(B $Bp4(B $Bp5(B $Bp6(B $Bp7(B $Bp8(B $Bp9(B $Bp:(B $Bp;(B $Bp<(B $Bp=(B $Bp>(B $Bp?(B
+$Bp@(B $BpA(B $BpB(B $BpC(B $BpD(B $BpE(B $BpF(B $BpG(B $BpH(B $BpI(B $BpJ(B $BpK(B $BpL(B $BpM(B $BpN(B $BpO(B
+$BpP(B $BpQ(B $BpR(B $BpS(B $BpT(B $BpU(B $BpV(B $BpW(B $BpX(B $BpY(B $BpZ(B $Bp[(B $Bp\(B $Bp](B $Bp^(B $Bp_(B
+$Bp`(B $Bpa(B $Bpb(B $Bpc(B $Bpd(B $Bpe(B $Bpf(B $Bpg(B $Bph(B $Bpi(B $Bpj(B $Bpk(B $Bpl(B $Bpm(B $Bpn(B $Bpo(B
+$Bpp(B $Bpq(B $Bpr(B $Bps(B $Bpt(B $Bpu(B $Bpv(B $Bpw(B $Bpx(B $Bpy(B $Bpz(B $Bp{(B $Bp|(B $Bp}(B $Bp~(B
+   $Bq!(B $Bq"(B $Bq#(B $Bq$(B $Bq%(B $Bq&(B $Bq'(B $Bq((B $Bq)(B $Bq*(B $Bq+(B $Bq,(B $Bq-(B $Bq.(B $Bq/(B
+$Bq0(B $Bq1(B $Bq2(B $Bq3(B $Bq4(B $Bq5(B $Bq6(B $Bq7(B $Bq8(B $Bq9(B $Bq:(B $Bq;(B $Bq<(B $Bq=(B $Bq>(B $Bq?(B
+$Bq@(B $BqA(B $BqB(B $BqC(B $BqD(B $BqE(B $BqF(B $BqG(B $BqH(B $BqI(B $BqJ(B $BqK(B $BqL(B $BqM(B $BqN(B $BqO(B
+$BqP(B $BqQ(B $BqR(B $BqS(B $BqT(B $BqU(B $BqV(B $BqW(B $BqX(B $BqY(B $BqZ(B $Bq[(B $Bq\(B $Bq](B $Bq^(B $Bq_(B
+$Bq`(B $Bqa(B $Bqb(B $Bqc(B $Bqd(B $Bqe(B $Bqf(B $Bqg(B $Bqh(B $Bqi(B $Bqj(B $Bqk(B $Bql(B $Bqm(B $Bqn(B $Bqo(B
+$Bqp(B $Bqq(B $Bqr(B $Bqs(B $Bqt(B $Bqu(B $Bqv(B $Bqw(B $Bqx(B $Bqy(B $Bqz(B $Bq{(B $Bq|(B $Bq}(B $Bq~(B
+   $Br!(B $Br"(B $Br#(B $Br$(B $Br%(B $Br&(B $Br'(B $Br((B $Br)(B $Br*(B $Br+(B $Br,(B $Br-(B $Br.(B $Br/(B
+$Br0(B $Br1(B $Br2(B $Br3(B $Br4(B $Br5(B $Br6(B $Br7(B $Br8(B $Br9(B $Br:(B $Br;(B $Br<(B $Br=(B $Br>(B $Br?(B
+$Br@(B $BrA(B $BrB(B $BrC(B $BrD(B $BrE(B $BrF(B $BrG(B $BrH(B $BrI(B $BrJ(B $BrK(B $BrL(B $BrM(B $BrN(B $BrO(B
+$BrP(B $BrQ(B $BrR(B $BrS(B $BrT(B $BrU(B $BrV(B $BrW(B $BrX(B $BrY(B $BrZ(B $Br[(B $Br\(B $Br](B $Br^(B $Br_(B
+$Br`(B $Bra(B $Brb(B $Brc(B $Brd(B $Bre(B $Brf(B $Brg(B $Brh(B $Bri(B $Brj(B $Brk(B $Brl(B $Brm(B $Brn(B $Bro(B
+$Brp(B $Brq(B $Brr(B $Brs(B $Brt(B $Bru(B $Brv(B $Brw(B $Brx(B $Bry(B $Brz(B $Br{(B $Br|(B $Br}(B $Br~(B
+   $Bs!(B $Bs"(B $Bs#(B $Bs$(B $Bs%(B $Bs&(B $Bs'(B $Bs((B $Bs)(B $Bs*(B $Bs+(B $Bs,(B $Bs-(B $Bs.(B $Bs/(B
+$Bs0(B $Bs1(B $Bs2(B $Bs3(B $Bs4(B $Bs5(B $Bs6(B $Bs7(B $Bs8(B $Bs9(B $Bs:(B $Bs;(B $Bs<(B $Bs=(B $Bs>(B $Bs?(B
+$Bs@(B $BsA(B $BsB(B $BsC(B $BsD(B $BsE(B $BsF(B $BsG(B $BsH(B $BsI(B $BsJ(B $BsK(B $BsL(B $BsM(B $BsN(B $BsO(B
+$BsP(B $BsQ(B $BsR(B $BsS(B $BsT(B $BsU(B $BsV(B $BsW(B $BsX(B $BsY(B $BsZ(B $Bs[(B $Bs\(B $Bs](B $Bs^(B $Bs_(B
+$Bs`(B $Bsa(B $Bsb(B $Bsc(B $Bsd(B $Bse(B $Bsf(B $Bsg(B $Bsh(B $Bsi(B $Bsj(B $Bsk(B $Bsl(B $Bsm(B $Bsn(B $Bso(B
+$Bsp(B $Bsq(B $Bsr(B $Bss(B $Bst(B $Bsu(B $Bsv(B $Bsw(B $Bsx(B $Bsy(B $Bsz(B $Bs{(B $Bs|(B $Bs}(B $Bs~(B
+   $Bt!(B $Bt"(B $Bt#(B $Bt$(B $Bt%(B $Bt&(B
+
+JIS0123 ($BF|K\8l(B)		$B$3$s$K$A$O(B
+	JIS  -- $B855$(B  $B3+H/(B
+    $B/export/Users/ianl/1.4.2/test/sun/nio/cs/SCCS/s.ISO2022JP.data0%G!<%?%Y!<%9$KAw$k$Y$-$G$J$$$3$H$KCmL\$7$F$/$@$5$$!#(B</p>
diff --git a/jdk/test/sun/nio/cs/ISO8859x.java b/jdk/test/sun/nio/cs/ISO8859x.java
new file mode 100644
index 0000000..7befa96
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ISO8859x.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6419791
+ * @summary
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class ISO8859x {
+    final static byte[] lowBytes = new byte[0xa0];
+    final static char[] lowChars = new char[0xa0];
+    final static String lowString;
+    static {
+        for (int i = 0; i < 0xa0; i++) {
+            lowBytes[i] = (byte) i;
+            lowChars[i] = (char) i;
+        }
+        lowString = new String(lowChars);
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        String csn = cs.name();
+        System.out.println(csn);
+
+        check(cs.canEncode());
+        check(Arrays.equals(lowString.getBytes(csn), lowBytes));
+        check(new String(lowBytes, csn).equals(lowString));
+
+        CharsetEncoder encoder = cs.newEncoder();
+        CharsetDecoder decoder = cs.newDecoder();
+        decoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+               .onMalformedInput(CodingErrorAction.REPORT);
+        encoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+               .onMalformedInput(CodingErrorAction.REPORT);
+
+        byte[] bytes = new byte[1];
+        for (int c = 0xa0; c < 0x100; c++) {
+            try {
+                bytes[0] = (byte) c;
+                char[] chars;
+                try { chars = decoder.decode(ByteBuffer.wrap(bytes)).array(); }
+                catch (UnmappableCharacterException x) { continue; }
+                equal(chars.length, 1);
+                byte[] bytes2 = encoder.encode(CharBuffer.wrap(chars)).array();
+                check(Arrays.equals(bytes2, bytes));
+            } catch (Throwable t) {
+                System.out.printf("cs=%s c=%02x%n", cs, c);
+                unexpected(t);
+            }
+        }
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+            if (csn.matches(".*(8859).*"))
+                try { testCharset(cs); }
+                catch (Throwable t) { unexpected(t); }
+        }
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
diff --git a/jdk/test/sun/nio/cs/JISAutoDetectTest.java b/jdk/test/sun/nio/cs/JISAutoDetectTest.java
new file mode 100644
index 0000000..eb3b75d
--- /dev/null
+++ b/jdk/test/sun/nio/cs/JISAutoDetectTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4087261 4184592
+ * @summary Make sure to determine Japanese text encoding as correctly
+ * as possible.
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class JISAutoDetectTest {
+
+    class TestData {
+        byte[]  input;
+        byte[]  input2;                 // for second call
+        String  expectedCharset;
+    }
+    TestData[] data = new TestData[50];
+
+    public static void main(String[] argv) throws Exception {
+        JISAutoDetectTest test =  new JISAutoDetectTest();
+        test.execute();
+    }
+
+    void execute() throws Exception {
+        CharBuffer output = CharBuffer.allocate(128);
+        CharBuffer expectedOutput = CharBuffer.allocate(128);
+
+        for (int i = 0; i < data.length; i++) {
+            if (data[i] == null)
+                break;
+
+            CharsetDecoder autoDetect = Charset.forName("JISAutoDetect").newDecoder();
+            CharsetDecoder dec = Charset.forName(data[i].expectedCharset).newDecoder();
+            CoderResult ncr, mcr;
+            output.clear();
+            expectedOutput.clear();
+            ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input),
+                                    output,
+                                    true);
+            mcr = dec.decode(ByteBuffer.wrap(data[i].input),
+                             expectedOutput,
+                             true);
+
+            if (data[i].input2 != null) {
+                ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input2),
+                                       output,
+                                       true);
+                mcr = dec.decode(ByteBuffer.wrap(data[i].input2),
+                                 expectedOutput,
+                                 true);
+            }
+            String testNumber = " (test#: " + i + ")";
+            if (ncr != mcr)
+                throw new Exception("JISAutoDetect returned a wrong result");
+            output.flip();
+            expectedOutput.flip();
+            if (output.limit() != expectedOutput.limit())
+                throw new Exception("JISAutoDetect returned a wrong length"+testNumber);
+
+            for (int x = 0; x < output.limit(); x++) {
+                if (expectedOutput.charAt(x) != output.charAt(x))
+                    throw new Exception("JISAutoDetect returned a wrong string"+testNumber);
+            }
+        }
+    }
+
+    public JISAutoDetectTest() {
+        int i = 0;
+
+        // 0
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)'C', (byte)'o', (byte)'p', (byte)'y',
+                                     (byte)'r', (byte)'i', (byte)'g', (byte)'h',
+                                     (byte)'t', (byte)' ', (byte)0xa9, (byte)' ',
+                                     (byte)'1', (byte)'9', (byte)'9', (byte)'8' };
+        data[i].expectedCharset = "SJIS";
+
+        // 1
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                                     (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 };
+        data[i].expectedCharset = "SJIS";
+
+        // 2
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde};
+        data[i].expectedCharset = "SJIS";
+
+        // 3
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd };
+        data[i].expectedCharset = "SJIS";
+
+        // 4
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa };
+        data[i].expectedCharset = "SJIS";
+
+        // 5
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+                                     (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca };
+        data[i].expectedCharset = "EUC_JP";
+
+        // 6
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                                     (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 };
+        data[i].expectedCharset = "EUC_JP";
+
+        // 7 (for 4184592)
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
+        data[i].input2 = new byte[] { (byte)0x1b, (byte)'$', (byte)'B',
+                                      (byte)'#', (byte)'4', (byte)'$', (byte)'5',
+                                      (byte)0x1b, (byte)'(', (byte)'B' };
+        data[i].expectedCharset = "ISO2022JP";
+    }
+}
diff --git a/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java
new file mode 100644
index 0000000..da2123d
--- /dev/null
+++ b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4658679 4879644
+   @summary Checks replacement logic within EUC-TW decoder
+*/
+
+/*
+ * Tests goodness of fix for bugID 4658679: EUC-TW decoder should
+ * perform replacement when it encounters latin chars outside the
+ * normal US-ASCII range. For example: Isolated occurrences of
+ * French accented chars. See bugID: 4658679.
+ */
+import java.io.*;
+public class LatinCharReplacementTWTest {
+    public static void  main(String[] args) throws Exception {
+        final String bugID = "4658679";
+        // Attempt to decode
+        byte[] input = { (byte)0xa1,
+                         (byte)0xf0,
+                         (byte)'r',
+                         (byte)'e',
+                         (byte)'s',
+                         (byte)0xe9,  // illegal within EUC-TW
+                         (byte)'r',
+                         (byte)'v',
+                         (byte)0xe9,  // illegal within EUC-TW
+                         (byte)'s',
+                         (byte)0xa2,
+                         (byte)0xf8
+                       };
+
+        char[] expected = { (char) 0xa7,
+                         (char) 'r',
+                         (char) 'e',
+                         (char) 's',
+                         (char) 0xFFFD,  // replacement for accented lowercase e
+                         (char) 'r',
+                         (char) 'v',
+                         (char) 0xFFFD,  // replacement for accented lowercase e
+                         (char) 's',
+                         (char) 0xb0 };
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(input);
+        InputStreamReader isr = new InputStreamReader(bais, "x-EUC-TW");
+
+        char[] decoded = new char[128];
+        int numChars = isr.read(decoded);
+
+        if (numChars != expected.length) {
+            throw new Exception("failure of test for bug " + bugID);
+        }
+
+        for (int i = 0 ; i < numChars; i++) {
+           if (decoded[i] != expected[i])
+                throw new Exception("failure of test for bug " + bugID);
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/LeftOverSurrogate.java b/jdk/test/sun/nio/cs/LeftOverSurrogate.java
new file mode 100644
index 0000000..e235438
--- /dev/null
+++ b/jdk/test/sun/nio/cs/LeftOverSurrogate.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4160949
+   @summary Verify that left over high surrogate does not
+   cause an UnknownCharacterException when substitutition mode is turned on.
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class LeftOverSurrogate {
+
+    public static void main(String args[]) throws Exception {
+        String s = "abc\uD800\uDC00qrst"; // Valid surrogate
+        char[] c = s.toCharArray();
+        CharsetEncoder enc = Charset.forName("ISO8859_1").newEncoder()
+          .onUnmappableCharacter(CodingErrorAction.REPLACE);
+        /* Process the first 4 characters, including the high surrogate
+           which should be stored */
+        ByteBuffer bb = ByteBuffer.allocate(10);
+        CharBuffer cb = CharBuffer.wrap(c);
+        cb.limit(4);
+        enc.encode(cb, bb, false);
+        cb.limit(7);
+        enc.encode(cb, bb, true);
+        byte[] first = bb.array();
+        for(int i = 0; i < 7; i++)
+            System.err.printf("[%d]=%d was %d\n",
+                              i,
+                              (int) first[i] &0xffff,
+                              (int) c[i] & 0xffff);
+    }
+}
diff --git a/jdk/test/sun/nio/cs/MalformedSurrogates.java b/jdk/test/sun/nio/cs/MalformedSurrogates.java
new file mode 100644
index 0000000..c6d6713
--- /dev/null
+++ b/jdk/test/sun/nio/cs/MalformedSurrogates.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4153987
+   @summary Malformed surrogates should be handled by the converter in
+   substitution mode.
+ */
+
+import java.io.*;
+
+public class MalformedSurrogates {
+
+    public static void main(String[] args) throws Exception {
+
+        String fe = System.getProperty("file.encoding");
+        if (  fe.equalsIgnoreCase("UTF8")
+              || fe.equalsIgnoreCase("UTF-8")
+              || fe.equalsIgnoreCase("UTF_8"))
+            // This test is meaningless if the default charset
+            // does handle surrogates
+            return;
+
+        System.out.println("Testing string conversion...");
+        /* Example with malformed surrogate, and an offset */
+        String t = "abc\uD800\uDB00efgh";
+        String t2 = t.substring(2);
+        byte[] b = t2.getBytes();
+        System.err.println(b.length);
+        for (int i = 0; i < b.length; i++)
+            System.err.println("[" + i + "]" + "=" + (char) b[i]
+                               + "=" + (int) b[i]);
+        if (b.length != 7) {
+            throw new Exception("Bad string conversion for bad surrogate");
+        }
+
+        /* Example with a proper surrogate, no offset. Always worked */
+        String t3 = "abc\uD800\uDC00efgh";
+        byte[] b2 = t3.getBytes();
+        System.out.println(b2.length);
+        for(int i = 0; i < b2.length; i++)
+            System.err.println("[" + i + "]" + "=" + (char) b2[i]);
+        if (b2.length != 8) {
+            throw new Exception("Bad string conversion for good surrogate");
+        }
+
+        OutputStream os = new ByteArrayOutputStream();
+        OutputStreamWriter osw = new OutputStreamWriter(os);
+        System.out.println("Testing flush....");
+        /* Check for the case where the converter has a left over
+           high surrogate when flush is called on the converter */
+        osw.flush();
+        String s = "abc\uD800"; // High surrogate
+        char[] c = s.toCharArray();
+        osw.write(s, 0, 4);
+        osw.flush();
+
+        System.out.println("Testing convert...");
+        /* Verify that all other characters go through */
+        for (int k = 1; k < 65535 ; k++) {
+            osw.write("Char[" + k + "]=\"" + ((char) k) + "\"");
+        }
+
+    }
+}
diff --git a/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java
new file mode 100644
index 0000000..3e19aa1
--- /dev/null
+++ b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4831163 5053096 5056440
+ * @summary NIO charset basic verification of JISAutodetect decoder
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
+import static java.lang.System.*;
+
+public class NIOJISAutoDetectTest {
+    private static int failures = 0;
+
+    private static void fail(String failureMsg) {
+        System.out.println(failureMsg);
+        failures++;
+    }
+
+    private static void check(boolean cond, String msg) {
+        if (!cond) {
+            fail("test failed: " + msg);
+            new Exception().printStackTrace();
+        }
+    }
+
+    private static String SJISName() throws Exception {
+        return detectingCharset(new byte[] {(byte)0xbb, (byte)0xdd,
+                                            (byte)0xcf, (byte)0xb2});
+    }
+
+    private static String EUCJName() throws Exception {
+        return detectingCharset(new byte[] {(byte)0xa4, (byte)0xd2,
+                                            (byte)0xa4, (byte)0xe9});
+    }
+
+    private static String detectingCharset(byte[] bytes) throws Exception {
+        //----------------------------------------------------------------
+        // Test special public methods of CharsetDecoder while we're here
+        //----------------------------------------------------------------
+        CharsetDecoder cd = Charset.forName("JISAutodetect").newDecoder();
+        check(cd.isAutoDetecting(), "isAutodecting()");
+        check(! cd.isCharsetDetected(), "isCharsetDetected");
+        cd.decode(ByteBuffer.wrap(new byte[] {(byte)'A'}));
+        check(! cd.isCharsetDetected(), "isCharsetDetected");
+        try {
+            cd.detectedCharset();
+            fail("no IllegalStateException");
+        } catch (IllegalStateException e) {}
+        cd.decode(ByteBuffer.wrap(bytes));
+        check(cd.isCharsetDetected(), "isCharsetDetected");
+        Charset cs = cd.detectedCharset();
+        check(cs != null, "cs != null");
+        check(! cs.newDecoder().isAutoDetecting(), "isAutodetecting()");
+        return cs.name();
+    }
+
+    public static void main(String[] argv) throws Exception {
+        //----------------------------------------------------------------
+        // Used to throw BufferOverflowException
+        //----------------------------------------------------------------
+        out.println(new String(new byte[] {0x61}, "JISAutoDetect"));
+
+        //----------------------------------------------------------------
+        // InputStreamReader(...JISAutoDetect) used to infloop
+        //----------------------------------------------------------------
+        {
+            byte[] bytes = "ABCD\n".getBytes();
+            ByteArrayInputStream bais = new  ByteArrayInputStream(bytes);
+            InputStreamReader isr = new InputStreamReader(bais, "JISAutoDetect");
+            BufferedReader reader = new BufferedReader(isr);
+            check (reader.readLine().equals("ABCD"), "first read gets text");
+            // used to return "ABCD" on second and subsequent reads
+            check (reader.readLine() == null, "second read gets null");
+        }
+
+        //----------------------------------------------------------------
+        // Check all Japanese chars for sanity
+        //----------------------------------------------------------------
+        String SJIS = SJISName();
+        String EUCJ = EUCJName();
+        out.printf("SJIS charset is %s%n", SJIS);
+        out.printf("EUCJ charset is %s%n", EUCJ);
+
+        int cnt2022 = 0;
+        int cnteucj = 0;
+        int cntsjis = 0;
+        int cntBAD  = 0;
+        for (char c = '\u0000'; c < '\uffff'; c++) {
+            if (c == '\u001b' || // ESC
+                c == '\u2014')   // Em-Dash?
+                continue;
+            String s = new String (new char[] {c});
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle all chars that EUC-JP can,
+            // unless there is an ambiguity with SJIS.
+            //----------------------------------------------------------------
+            byte[] beucj = s.getBytes(EUCJ);
+            String seucj = new String(beucj, EUCJ);
+            if (seucj.equals(s)) {
+                cnteucj++;
+                String sauto = new String(beucj, "JISAutoDetect");
+
+                if (! sauto.equals(seucj)) {
+                    cntBAD++;
+                    String ssjis = new String(beucj, SJIS);
+                    if (! sauto.equals(ssjis)) {
+                        fail("Autodetection agrees with neither EUC nor SJIS");
+                    }
+                }
+            } else
+                continue; // Optimization
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle all chars that ISO-2022-JP can.
+            //----------------------------------------------------------------
+            byte[] b2022 = s.getBytes("ISO-2022-JP");
+            if (new String(b2022, "ISO-2022-JP").equals(s)) {
+                cnt2022++;
+                check(new String(b2022,"JISAutoDetect").equals(s),
+                      "ISO2022 autodetection");
+            }
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle almost all chars that SJIS can.
+            //----------------------------------------------------------------
+            byte[] bsjis = s.getBytes(SJIS);
+            if (new String(bsjis, SJIS).equals(s)) {
+                cntsjis++;
+                check(new String(bsjis,"JISAutoDetect").equals(s),
+                      "SJIS autodetection");
+            }
+        }
+        out.printf("There are %d ISO-2022-JP-encodable characters.%n", cnt2022);
+        out.printf("There are %d SJIS-encodable characters.%n",        cntsjis);
+        out.printf("There are %d EUC-JP-encodable characters.%n",      cnteucj);
+        out.printf("There are %d characters that are " +
+                   "misdetected as SJIS after being EUC-encoded.%n", cntBAD);
+
+
+        //----------------------------------------------------------------
+        // tests for specific byte sequences
+        //----------------------------------------------------------------
+        test("ISO-2022-JP", new byte[] {'A', 'B', 'C'});
+        test("EUC-JP",      new byte[] {'A', 'B', 'C'});
+        test("SJIS",        new byte[] {'A', 'B', 'C'});
+
+        test("SJIS",
+             new byte[] { 'C', 'o', 'p',  'y',  'r', 'i', 'g',  'h', 't',
+                          ' ', (byte)0xa9, ' ', '1', '9', '9',  '8' });
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                          (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 });
+
+        test("EUC-JP",
+             new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+                          (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca });
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde});
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd });
+
+        test("SJIS",
+             new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa });
+
+        test("EUC-JP",
+             new byte[] { (byte)0x8f, (byte)0xc5, (byte)0xe0, (byte)0x20});
+
+        test("EUC-JP",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                          (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 });
+
+        test("ISO-2022-JP",
+             new byte[] { 0x1b, '$', 'B', '#', '4', '$', '5', 0x1b, '(', 'B' });
+
+
+        //----------------------------------------------------------------
+        // Check handling of ambiguous end-of-input in middle of first char
+        //----------------------------------------------------------------
+        {
+            CharsetDecoder dc = Charset.forName("x-JISAutoDetect").newDecoder();
+            ByteBuffer bb = ByteBuffer.allocate(128);
+            CharBuffer cb = CharBuffer.allocate(128);
+            bb.put((byte)'A').put((byte)0x8f);
+            bb.flip();
+            CoderResult res = dc.decode(bb,cb,false);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 1, "bb.position()");
+            check(cb.position() == 1, "cb.position()");
+            res = dc.decode(bb,cb,false);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 1, "bb.position()");
+            check(cb.position() == 1, "cb.position()");
+            bb.compact();
+            bb.put((byte)0xa1);
+            bb.flip();
+            res = dc.decode(bb,cb,true);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 2, "bb.position()");
+            check(cb.position() == 2, "cb.position()");
+        }
+
+
+        if (failures > 0)
+            throw new RuntimeException(failures + " tests failed");
+    }
+
+    static void checkCoderResult(CoderResult result) {
+        check(result.isUnderflow(),
+              "Unexpected coder result: " + result);
+    }
+
+    static void test(String expectedCharset, byte[] input) throws Exception {
+        Charset cs = Charset.forName("x-JISAutoDetect");
+        CharsetDecoder autoDetect = cs.newDecoder();
+
+        Charset cs2 = Charset.forName(expectedCharset);
+        CharsetDecoder decoder = cs2.newDecoder();
+
+        ByteBuffer bb = ByteBuffer.allocate(128);
+        CharBuffer charOutput = CharBuffer.allocate(128);
+        CharBuffer charExpected = CharBuffer.allocate(128);
+
+        bb.put(input);
+        bb.flip();
+        bb.mark();
+
+        CoderResult result = autoDetect.decode(bb, charOutput, true);
+        checkCoderResult(result);
+        charOutput.flip();
+        String actual = charOutput.toString();
+
+        bb.reset();
+
+        result = decoder.decode(bb, charExpected, true);
+        checkCoderResult(result);
+        charExpected.flip();
+        String expected = charExpected.toString();
+
+        check(actual.equals(expected),
+              String.format("actual=%s expected=%s", actual, expected));
+    }
+}
diff --git a/jdk/test/sun/nio/cs/ReadZero.java b/jdk/test/sun/nio/cs/ReadZero.java
new file mode 100644
index 0000000..d676b9e
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ReadZero.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @summary Verify that if InputStream.read returns 0 we throw an exception.
+ * @bug 4684515
+ */
+
+import java.io.*;
+
+public class ReadZero {
+
+    public static void main(String [] args) throws IOException {
+        ReadZero r = new ReadZero();
+        r.testInputStream();
+    }
+
+    private void testInputStream() throws IOException {
+        File f = new File(System.getProperty("test.src", "."), "ReadZero.java");
+        InputStream is = new FileInputStream(f) {
+            public int read(byte [] b, int off, int len) {
+                System.out.println("FileInputStream.read");
+                return 0;
+            }
+        };
+
+        is.read(new byte[1], 0, 1); // ok
+        InputStreamReader isr = new InputStreamReader(is);
+
+        try {
+            int res = isr.read(new char[1], 0, 1);
+        } catch (IOException x) {
+            System.out.println("IOException caught");
+            return;
+        }
+        throw new RuntimeException("IOException not thrown");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/SJISCanEncode.java b/jdk/test/sun/nio/cs/SJISCanEncode.java
new file mode 100644
index 0000000..9e843bf
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SJISCanEncode.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4913702
+   @summary validates canEncode(char c) method for sun.nio.cs.Shift_JIS
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SJISCanEncode {
+    private Charset cs;
+    private CharsetEncoder encoder;
+
+    private void canEncodeTest(char inputChar,
+                               boolean expectedResult)
+                               throws Exception {
+        String msg = "err: Shift_JIS canEncode() return value ";
+
+        if (encoder.canEncode(inputChar) != expectedResult) {
+            throw new Exception(msg + !(expectedResult) +
+                ": "  + Integer.toHexString((int)inputChar));
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        SJISCanEncode test = new SJISCanEncode();
+        test.cs = Charset.forName("SJIS");
+        test.encoder = test.cs.newEncoder();
+
+        // us-ascii (mappable by Shift_JIS)
+        test.canEncodeTest('\u0001', true);
+
+        // Halfwidth Katakana
+        test.canEncodeTest('\uFF01', true);
+
+        // CJK ideograph
+        test.canEncodeTest('\u4E9C', true);
+
+        //Hiragana
+        test.canEncodeTest('\u3041', true);
+        // fullwidth Katakana
+        test.canEncodeTest('\u30A1', true);
+
+        // U+0080 should be unmappable
+        // U+4000 is a BMP character not covered by Shift_JISe
+
+        test.canEncodeTest('\u0080', false);
+        test.canEncodeTest('\u4000', false);
+    }
+}
diff --git a/jdk/test/sun/nio/cs/StreamEncoderClose.java b/jdk/test/sun/nio/cs/StreamEncoderClose.java
new file mode 100644
index 0000000..9c7d6b5
--- /dev/null
+++ b/jdk/test/sun/nio/cs/StreamEncoderClose.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 5005426
+   @summary Check if StreamEncoder close() method works correctly from
+            error recovery after the underneath OutputStream failed to
+            close the first time.
+ */
+
+import java.io.*;
+public class StreamEncoderClose {
+    public static void main( String arg[] ) throws Exception {
+        byte[] expected = {(byte)0x1b,(byte)0x24,(byte)0x42,
+                           (byte)0x30,(byte)0x6c,
+                           (byte)0x1b,(byte)0x28,(byte)0x42};
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        MyBufferedOutputStream mbos = new MyBufferedOutputStream(baos);
+        PrintWriter pw = new PrintWriter(new OutputStreamWriter(mbos, "ISO-2022-JP"));
+        mbos.dontClose();
+        pw.write("\u4e00");
+        pw.close();             //  1st PrintWriter Close
+        mbos.canClose();
+        pw.close();             //  2nd PrintWriter Close
+
+        //double check, probably not necessary
+        byte[] out = baos.toByteArray();
+        if (out.length != expected.length) {
+            throw new IOException("Failed");
+        }
+        for (int i = 0; i < out.length; i++) {
+            //System.out.printf("(byte)0x%x,", out[i] & 0xff);
+            if (out[i] != expected[i])
+                throw new IOException("Failed");
+        }
+    }
+
+    static class MyBufferedOutputStream extends BufferedOutputStream {
+        MyBufferedOutputStream(OutputStream os) {
+            super(os);
+        }
+        private boolean status;
+        public void dontClose() {
+            status = false;
+        }
+        public void canClose() {
+            status = true;
+        }
+        public void close() throws IOException {
+            if ( status == false ) {
+                throw new IOException("Can't close ");
+            }
+            super.close();
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/SurrogateGB18030Test.java b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java
new file mode 100644
index 0000000..f104463
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4896454
+   @summary Check GB18030 surrogate encoding/decoding handling
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SurrogateGB18030Test {
+    public static void main(String[] args) throws Exception {
+        SurrogateGB18030Test test = new SurrogateGB18030Test();
+
+        test.roundtripTest();
+
+        /**
+         * Valid Surrogate pair and 4 byte GB18030 representation
+         */
+
+        String inputString =  "\uD800\uDC00";
+
+        byte[] expectedBytes = { (byte)0x90,
+                                 (byte)0x30,
+                                 (byte)0x81,
+                                 (byte)0x30
+                               };
+        test.encodeTest(inputString, expectedBytes);
+
+        /**
+         * Vice-versa : check that 4 byte GB18030 value encodes correctly
+         */
+
+        String expectedStr = "\uDBFF\uDFFF";
+
+        byte[] inputBytes = { (byte)0xe3,
+                              (byte)0x32,
+                              (byte)0x9a,
+                              (byte)0x35
+                              };
+
+
+        test.decodeTest(inputBytes, expectedStr);
+
+    }
+
+    private void roundtripTest() throws Exception
+    {
+        byte[] ba;
+        char[] pair = new char[2];
+        for (char high = '\ud800'; high <= '\udbff'; high++) {
+            for (char low = '\udc00'; low <= '\udfff'; low++) {
+                pair[0] = high;
+                pair[1] = low;
+                String s = new String(pair);
+                if (!s.equals(new String(s.getBytes("gb18030"), "gb18030")))
+                    throw new Exception ("GB18030 roundtrip failure");
+            }
+        }
+
+    }
+
+    private void encodeTest(String inputString, byte[] expectedBytes)
+        throws Exception
+    {
+        byte[] encoded = inputString.getBytes("GB18030");
+
+        CharBuffer cb = CharBuffer.wrap(inputString.toCharArray());
+        ByteBuffer bb = ByteBuffer.allocate(4);
+
+        CharsetEncoder encoder = Charset.forName("GB18030").newEncoder();
+        encoder.encode(cb, bb, true);
+
+        bb.flip();
+        for (int i = 0 ; i < expectedBytes.length; i++) {
+            if (encoded[i] != expectedBytes[i]
+                || bb.get() != expectedBytes[i])
+                    throw new Exception ("GB18030 encode failure");
+        }
+    }
+
+    private void decodeTest(byte[] inputBytes, String expectedStr)
+        throws Exception
+    {
+        String s2 = new String(inputBytes, "GB18030");
+
+        CharsetDecoder decoder = Charset.forName("GB18030").newDecoder();
+
+        ByteBuffer bb = ByteBuffer.wrap(inputBytes);
+        CharBuffer cb = CharBuffer.allocate(2);
+        decoder.decode(bb, cb, true);
+
+        cb.flip();
+        for (int i = 0 ; i < expectedStr.length(); i++) {
+            if (expectedStr.charAt(i) != cb.get()
+                || s2.charAt(i) != expectedStr.charAt(i))
+                    throw new Exception ("GB18030 encode failure");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java
new file mode 100644
index 0000000..25aa0c0
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4847097
+   @summary Check surrogate coverage of EUC_TW
+ */
+
+/*
+ * Tests the full surrogate mapping roundtrip fidelity of the
+ * EUC-TW charset coder updated to support the additional
+ * planes 4,5,6,7,15
+ *
+ * byte->char mappings are contained in external files
+ * using plane{x}.surrogate as the convention for the input filenames
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestEUCTW {
+
+    private static final String testRootDir
+        = System.getProperty("test.src", ".");
+
+    public static void main(String[] args) throws Exception {
+        char[] surrogatePair = new char[2];
+        int[] expectBytes = new int[4];
+
+        // Iterate test over each supported CNS-11643 plane
+        // containing supplementary character mappings
+
+        String[] testPlane = { "3", "4", "5", "6" ,"7", "15" };
+
+        for (int i = 0 ; i < testPlane.length; i++) {
+            FileReader f = new FileReader(testRootDir +
+                                          System.getProperty("file.separator")
+                                          + "SurrogateTestEUCTW.plane"
+                                          + testPlane[i]
+                                          + ".surrogates");
+            BufferedReader r = new BufferedReader(f);
+            String line;
+
+            while ((line = r.readLine()) != null) {
+                int charValue = Integer.parseInt(line.substring(9,14), 16);
+                surrogatePair[0] = (char) ((charValue - 0x10000) / 0x400
+                                    + 0xd800);
+                surrogatePair[1] = (char) ((charValue - 0x10000) % 0x400
+                                    + 0xdc00);
+                // Synthesize 4 byte expected byte values from CNS input values
+                expectBytes[0] = 0x8E;
+                expectBytes[1] = 0xA0 + Integer.parseInt(testPlane[i]);
+                expectBytes[2] = 0x80 | Integer.parseInt(line.substring(2,4), 16);
+                expectBytes[3] = 0x80 | Integer.parseInt(line.substring(4,6), 16);
+
+                String testStr = new String(surrogatePair);
+                byte[] encodedBytes = testStr.getBytes("EUC-TW");
+
+                for (int x = 0 ; x < 4 ; x++) {
+                    if (encodedBytes[x] != (byte)(expectBytes[x] & 0xff)) {
+                        throw new Exception("EUC_TW Surrogate Encoder error");
+                    }
+                }
+
+                // Next: test round-trip fidelity
+                String decoded = new String(encodedBytes, "EUC-TW");
+
+                if (!decoded.equals(testStr)) {
+                    throw new Exception("EUCTW Decoder error");
+                }
+            }
+            r.close();
+            f.close();
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates
new file mode 100644
index 0000000..24c1a00
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates
@@ -0,0 +1,6476 @@
+0x2121	0x20002	
+0x2122	0x2008C	
+0x2123	0x200D4	
+0x2124	0x201A5	
+0x2125	0x20092	
+0x2126	0x20093	
+0x2127	0x200D8	
+0x2128	0x200D9	
+0x2129	0x201A7	
+0x212A	0x2062B	
+0x212B	0x2062C	
+0x212C	0x2062D	
+0x212D	0x20630	
+0x212E	0x2062E	
+0x212F	0x206AB	
+0x2131	0x2092D	
+0x2132	0x2096D	
+0x2133	0x2F834	
+0x2134	0x20A0F	
+0x2136	0x20B9D	
+0x2137	0x211A2	
+0x2138	0x215D4	
+0x2139	0x21B56	
+0x213A	0x21BC3	
+0x213B	0x22014	
+0x213D	0x2471A	
+0x213E	0x2000F	
+0x213F	0x20010	
+0x2140	0x2009A	
+0x2141	0x2009B	
+0x2143	0x201AC	
+0x2145	0x20097	
+0x2146	0x20546	
+0x2148	0x20576	
+0x2149	0x20577	
+0x214A	0x205AE	
+0x214B	0x2063A	
+0x214C	0x2067D	
+0x214D	0x21BC5	
+0x214E	0x20BA8	
+0x2151	0x21241	
+0x2152	0x21242	
+0x2153	0x215D8	
+0x2154	0x215D9	
+0x2155	0x216AA	
+0x2156	0x216AB	
+0x2157	0x21942	
+0x2158	0x21941	
+0x215A	0x21BC6	
+0x215C	0x21D35	
+0x215D	0x21D36	
+0x215E	0x21D37	
+0x215F	0x2F883	
+0x2160	0x2634D	
+0x2162	0x221B5	
+0x2163	0x22317	
+0x2164	0x22482	
+0x2165	0x233B6	
+0x2167	0x23C72	
+0x2168	0x2455C	
+0x2169	0x245A8	
+0x216B	0x215E3	
+0x216E	0x200E6	
+0x216F	0x20144	
+0x2170	0x20145	
+0x2173	0x201C4	
+0x2174	0x201C5	
+0x2175	0x201C6	
+0x2176	0x201C7	
+0x2177	0x201C8	
+0x2178	0x201C9	
+0x2179	0x201CA	
+0x217A	0x201D4	
+0x217B	0x2057D	
+0x217C	0x26272	
+0x217D	0x205B2	
+0x217E	0x205B4	
+0x2221	0x20682	
+0x2222	0x206C7	
+0x2223	0x206C8	
+0x2225	0x2083C	
+0x2226	0x2083D	
+0x2227	0x2083E	
+0x2228	0x2083F	
+0x2229	0x2F824	
+0x222A	0x208D3	
+0x222B	0x20147	
+0x222D	0x20A3D	
+0x222E	0x20AE2	
+0x222F	0x20BB8	
+0x2230	0x20BB9	
+0x2231	0x20BC2	
+0x2232	0x20BBA	
+0x2233	0x20BC6	
+0x2234	0x20BBB	
+0x2235	0x211AD	
+0x2236	0x2124C	
+0x2237	0x2124D	
+0x2239	0x216B2	
+0x223A	0x216B3	
+0x223B	0x216B4	
+0x223C	0x216B5	
+0x223D	0x219C3	
+0x223E	0x219C4	
+0x223F	0x219C5	
+0x2240	0x219C6	
+0x2241	0x219C7	
+0x2243	0x21BCE	
+0x2244	0x21C30	
+0x2245	0x21D47	
+0x2246	0x21D48	
+0x2248	0x2205C	
+0x224A	0x2205F	
+0x224B	0x22318	
+0x224C	0x22319	
+0x224D	0x2237E	
+0x224F	0x225B0	
+0x2250	0x22A75	
+0x2252	0x22A76	
+0x2253	0x23041	
+0x2254	0x23142	
+0x2256	0x233BD	
+0x225A	0x23B1E	
+0x225B	0x23B1F	
+0x225C	0x23C87	
+0x225E	0x23C78	
+0x225F	0x24188	
+0x2260	0x24189	
+0x2261	0x2418A	
+0x2262	0x24617	
+0x2263	0x24615	
+0x2267	0x250E5	
+0x2268	0x25609	
+0x2269	0x2573B	
+0x226A	0x2574F	
+0x226C	0x2662E	
+0x226D	0x2662F	
+0x226E	0x26AFF	
+0x226F	0x26AFD	
+0x2270	0x26AFE	
+0x2274	0x20023	
+0x2275	0x200EA	
+0x2276	0x2012A	
+0x2277	0x20149	
+0x2278	0x2014A	
+0x2279	0x2014B	
+0x227A	0x201DF	
+0x227B	0x201E0	
+0x227C	0x201E1	
+0x227D	0x201E2	
+0x227E	0x205C1	
+0x2321	0x201E3	
+0x2322	0x201E4	
+0x2323	0x201E5	
+0x2324	0x205C0	
+0x2325	0x201E6	
+0x2326	0x201F7	
+0x2328	0x201E7	
+0x2329	0x201E8	
+0x232A	0x201E9	
+0x232B	0x201EA	
+0x232C	0x201EB	
+0x232D	0x2050E	
+0x232E	0x20580	
+0x232F	0x20581	
+0x2330	0x205BA	
+0x2331	0x205BB	
+0x2332	0x205BC	
+0x2333	0x205BD	
+0x2334	0x2063F	
+0x2335	0x20640	
+0x2336	0x20688	
+0x2337	0x2F81F	
+0x2338	0x20846	
+0x233A	0x20847	
+0x233B	0x20848	
+0x233C	0x20936	
+0x233D	0x20972	
+0x233E	0x20996	
+0x233F	0x20A47	
+0x2340	0x20AE7	
+0x2341	0x20B34	
+0x2342	0x20B35	
+0x2343	0x20B36	
+0x2344	0x20B37	
+0x2345	0x20BE3	
+0x2346	0x20BE4	
+0x2347	0x20BE5	
+0x2348	0x20BEB	
+0x234A	0x20BE6	
+0x234B	0x20BE7	
+0x234C	0x20BE8	
+0x234F	0x211B9	
+0x2351	0x211BA	
+0x2353	0x21263	
+0x2354	0x21264	
+0x2356	0x21265	
+0x2358	0x21266	
+0x2359	0x2127C	
+0x235A	0x21267	
+0x235B	0x2F85A	
+0x235C	0x21559	
+0x235D	0x215E9	
+0x235E	0x215EA	
+0x235F	0x215EB	
+0x2360	0x215EC	
+0x2361	0x215ED	
+0x2362	0x215EE	
+0x2363	0x215EF	
+0x2364	0x216BF	
+0x2365	0x216CB	
+0x2366	0x216C3	
+0x2367	0x216D5	
+0x2368	0x216C4	
+0x2369	0x216C5	
+0x236A	0x216D3	
+0x236B	0x216C6	
+0x236C	0x216C7	
+0x236D	0x216C8	
+0x236E	0x216C9	
+0x236F	0x216CA	
+0x2370	0x2194A	
+0x2372	0x219D1	
+0x2373	0x21B61	
+0x2374	0x21C37	
+0x2376	0x21D64	
+0x2377	0x21D66	
+0x2379	0x21D67	
+0x237A	0x21D68	
+0x237B	0x21D69	
+0x237D	0x21D73	
+0x237E	0x21D6A	
+0x2421	0x21D6B	
+0x2424	0x22072	
+0x2426	0x221B9	
+0x2427	0x2231C	
+0x2428	0x22336	
+0x2429	0x223BC	
+0x242A	0x223BE	
+0x242B	0x223BF	
+0x242C	0x223C0	
+0x242D	0x22487	
+0x242E	0x225DC	
+0x242F	0x225DD	
+0x2430	0x225F5	
+0x2431	0x225DE	
+0x2432	0x225DF	
+0x2433	0x2F89E	
+0x2434	0x225E0	
+0x2435	0x225E1	
+0x2436	0x225E2	
+0x2437	0x22A2C	
+0x2438	0x22A2D	
+0x243A	0x22AA9	
+0x243B	0x22A9C	
+0x243C	0x22A9D	
+0x243D	0x22A9E	
+0x243E	0x22A9F	
+0x243F	0x22AA0	
+0x2440	0x22AA1	
+0x2441	0x22AA2	
+0x2443	0x22AA3	
+0x2444	0x22AA4	
+0x2445	0x22AA7	
+0x2446	0x23042	
+0x2447	0x23093	
+0x2448	0x23151	
+0x244A	0x23152	
+0x244B	0x23144	
+0x244C	0x23153	
+0x244D	0x23322	
+0x244E	0x233C6	
+0x244F	0x233C7	
+0x2450	0x233C9	
+0x2451	0x2F8DD	
+0x2452	0x233CA	
+0x2454	0x233C8	
+0x2455	0x23B24	
+0x2456	0x23B25	
+0x2457	0x23B26	
+0x2459	0x23B27	
+0x245A	0x23B28	
+0x245C	0x23C58	
+0x245D	0x2F8FB	
+0x245E	0x23CA7	
+0x245F	0x23C88	
+0x2460	0x23C89	
+0x2461	0x23CA5	
+0x2462	0x23CA8	
+0x2463	0x23CA9	
+0x2464	0x23CAA	
+0x2465	0x23CAB	
+0x2466	0x23CAC	
+0x2467	0x23CAD	
+0x2469	0x23C79	
+0x246B	0x24194	
+0x246C	0x24195	
+0x246D	0x24196	
+0x2470	0x24197	
+0x2472	0x24198	
+0x2473	0x2454E	
+0x2474	0x2454F	
+0x2475	0x24619	
+0x2477	0x24741	
+0x2478	0x2F92A	
+0x2479	0x248F7	
+0x247A	0x24C04	
+0x247B	0x24C19	
+0x247C	0x24C17	
+0x247D	0x25040	
+0x247E	0x250EC	
+0x2521	0x2541B	
+0x2522	0x2541C	
+0x2524	0x2560E	
+0x2525	0x25752	
+0x2526	0x25AD8	
+0x2527	0x25E26	
+0x2528	0x26274	
+0x252A	0x26275	
+0x252B	0x269C6	
+0x252C	0x26B0B	
+0x252D	0x26B0C	
+0x252E	0x26B0D	
+0x252F	0x26B0E	
+0x2530	0x26B0F	
+0x2531	0x26B10	
+0x2533	0x28459	
+0x2534	0x2845A	
+0x2535	0x28683	
+0x2536	0x28684	
+0x2537	0x28685	
+0x253A	0x28E20	
+0x253B	0x28E21	
+0x253C	0x28E22	
+0x253D	0x28E23	
+0x253E	0x28E24	
+0x253F	0x28E29	
+0x2540	0x200F4	
+0x2542	0x2158F	
+0x2543	0x20151	
+0x2545	0x20217	
+0x2546	0x20218	
+0x2547	0x2025B	
+0x2548	0x20219	
+0x2549	0x2021A	
+0x254B	0x2021B	
+0x254C	0x2021C	
+0x254D	0x2021D	
+0x254E	0x2021E	
+0x254F	0x2021F	
+0x2550	0x20220	
+0x2551	0x20221	
+0x2552	0x2048B	
+0x2553	0x20488	
+0x2555	0x20585	
+0x2556	0x26287	
+0x2557	0x205C7	
+0x2558	0x2064C	
+0x2559	0x2064D	
+0x255A	0x206FC	
+0x255B	0x206FD	
+0x255C	0x206FE	
+0x255D	0x206FF	
+0x2560	0x20856	
+0x2561	0x20857	
+0x2562	0x20858	
+0x2563	0x20859	
+0x2564	0x208DC	
+0x2565	0x208DD	
+0x2566	0x20973	
+0x2567	0x2099D	
+0x2568	0x209A1	
+0x2569	0x2099E	
+0x256A	0x2099F	
+0x256B	0x209A0	
+0x256C	0x209E6	
+0x256D	0x20A51	
+0x256E	0x20A52	
+0x256F	0x20B3D	
+0x2570	0x20C22	
+0x2572	0x20C23	
+0x2573	0x20C24	
+0x2574	0x20C25	
+0x2575	0x20C26	
+0x2576	0x20C27	
+0x2577	0x20C28	
+0x2578	0x20C29	
+0x2579	0x20C2A	
+0x257A	0x20C2B	
+0x257C	0x20C40	
+0x257D	0x20C2C	
+0x257E	0x20C2D	
+0x2621	0x20C2E	
+0x2622	0x20C2F	
+0x2623	0x20C30	
+0x2624	0x211D0	
+0x2625	0x212A8	
+0x2626	0x21294	
+0x2627	0x21295	
+0x2628	0x21296	
+0x2629	0x21297	
+0x262A	0x21298	
+0x262B	0x2129C	
+0x262C	0x2129B	
+0x262E	0x212A1	
+0x262F	0x212A0	
+0x2630	0x21299	
+0x2631	0x2129A	
+0x2632	0x212A7	
+0x2634	0x21564	
+0x2636	0x21600	
+0x2637	0x21601	
+0x263A	0x216E5	
+0x263B	0x216E9	
+0x263C	0x216FB	
+0x263D	0x216FC	
+0x263E	0x216EA	
+0x263F	0x216EB	
+0x2640	0x216EC	
+0x2641	0x216ED	
+0x2642	0x216EE	
+0x2643	0x216EF	
+0x2644	0x216FA	
+0x2645	0x216F0	
+0x2646	0x216F1	
+0x2647	0x216F2	
+0x2648	0x216F3	
+0x2649	0x216F4	
+0x264A	0x21952	
+0x264B	0x21953	
+0x264C	0x21954	
+0x264D	0x21955	
+0x264E	0x21958	
+0x264F	0x21956	
+0x2651	0x219DD	
+0x2652	0x219DE	
+0x2653	0x219E3	
+0x2654	0x219DF	
+0x2655	0x219E0	
+0x2656	0x21B22	
+0x2657	0x21B23	
+0x2658	0x21B68	
+0x2659	0x21BDF	
+0x265B	0x21C44	
+0x265C	0x21D94	
+0x265D	0x21D95	
+0x265E	0x21D96	
+0x265F	0x21D97	
+0x2660	0x21D98	
+0x2661	0x21D99	
+0x2662	0x2F879	
+0x2663	0x21D9A	
+0x2664	0x21D9B	
+0x2665	0x21D9D	
+0x2666	0x21D9E	
+0x2667	0x21D9F	
+0x2668	0x21DA0	
+0x2669	0x21FF3	
+0x266A	0x21FF2	
+0x266B	0x2201F	
+0x266C	0x22088	
+0x266D	0x2218F	
+0x266E	0x22190	
+0x2670	0x221FD	
+0x2671	0x221FE	
+0x2672	0x221FF	
+0x2673	0x22200	
+0x2674	0x22201	
+0x2675	0x2261A	
+0x2677	0x225E3	
+0x2678	0x225E4	
+0x2679	0x225E5	
+0x267A	0x225E6	
+0x267B	0x225E7	
+0x267C	0x225EB	
+0x267D	0x225E8	
+0x267E	0x225E9	
+0x2721	0x225EA	
+0x2722	0x2261D	
+0x2723	0x229A4	
+0x2724	0x229A3	
+0x2725	0x22AD4	
+0x2726	0x22AC6	
+0x2727	0x22AC7	
+0x2728	0x22AC8	
+0x2729	0x22AC9	
+0x272A	0x22ACA	
+0x272B	0x22ACB	
+0x272C	0x22ACC	
+0x272D	0x22ACD	
+0x272F	0x22ACE	
+0x2731	0x22EB8	
+0x2732	0x22EB9	
+0x2733	0x22EBA	
+0x2734	0x2306E	
+0x2735	0x230DB	
+0x2736	0x230DC	
+0x2737	0x23168	
+0x2738	0x23169	
+0x2739	0x2316A	
+0x273A	0x2316B	
+0x273B	0x2316C	
+0x273C	0x2316D	
+0x273D	0x2316E	
+0x273F	0x23324	
+0x2740	0x23325	
+0x2742	0x23400	
+0x2743	0x233E5	
+0x2744	0x233F9	
+0x2745	0x233E7	
+0x2746	0x233E8	
+0x2747	0x233E9	
+0x2748	0x233FE	
+0x2749	0x233EA	
+0x274A	0x233EB	
+0x274B	0x233EC	
+0x274D	0x233ED	
+0x274F	0x233EE	
+0x2751	0x233EF	
+0x2753	0x23417	
+0x2754	0x233F0	
+0x2755	0x233F1	
+0x2756	0x23894	
+0x2757	0x2395B	
+0x2758	0x2395C	
+0x2759	0x2395D	
+0x275A	0x23B2F	
+0x275C	0x23B30	
+0x275D	0x23B31	
+0x275E	0x23B32	
+0x275F	0x23B33	
+0x2760	0x23CCC	
+0x2761	0x23CCD	
+0x2762	0x23CCE	
+0x2763	0x23CAE	
+0x2764	0x23CAF	
+0x2765	0x23CB0	
+0x2767	0x23CCF	
+0x2768	0x23CD0	
+0x2769	0x23CD1	
+0x276A	0x23CD2	
+0x276B	0x23CD3	
+0x276D	0x23CD4	
+0x276F	0x241A6	
+0x2770	0x241A7	
+0x2771	0x241A8	
+0x2772	0x241B0	
+0x2773	0x241A9	
+0x2774	0x241AA	
+0x2775	0x241AB	
+0x2776	0x241AC	
+0x2777	0x241AD	
+0x2778	0x244FB	
+0x2779	0x244FC	
+0x277B	0x2462D	
+0x277C	0x2462E	
+0x277D	0x24650	
+0x277E	0x2462F	
+0x2821	0x24630	
+0x2822	0x24765	
+0x2823	0x248E6	
+0x2824	0x2490C	
+0x2825	0x24902	
+0x2826	0x24903	
+0x2827	0x24904	
+0x2828	0x24905	
+0x2829	0x24906	
+0x282B	0x24BC0	
+0x282C	0x24C24	
+0x282D	0x24C25	
+0x282E	0x24D16	
+0x282F	0x24D32	
+0x2830	0x25420	
+0x2831	0x25421	
+0x2832	0x25422	
+0x2833	0x25423	
+0x2835	0x25425	
+0x2836	0x25619	
+0x2837	0x25624	
+0x2838	0x2561A	
+0x2839	0x2561B	
+0x283A	0x2561C	
+0x283B	0x2561D	
+0x283C	0x2F952	
+0x283D	0x2561E	
+0x283E	0x2575A	
+0x283F	0x2575B	
+0x2840	0x2575C	
+0x2841	0x2575D	
+0x2842	0x2575E	
+0x2843	0x25931	
+0x2845	0x25E29	
+0x2847	0x25F88	
+0x2848	0x25F89	
+0x2849	0x26289	
+0x284B	0x26356	
+0x284C	0x264D1	
+0x284D	0x264E6	
+0x284E	0x26532	
+0x284F	0x26533	
+0x2850	0x26652	
+0x2851	0x26653	
+0x2853	0x26654	
+0x2854	0x26655	
+0x2857	0x26B29	
+0x2858	0x26B2A	
+0x2859	0x26B2B	
+0x285A	0x26B2C	
+0x285B	0x26B2D	
+0x285C	0x2F992	
+0x285D	0x26B2E	
+0x285E	0x26B2F	
+0x285F	0x26B30	
+0x2860	0x26B31	
+0x2861	0x26B32	
+0x2862	0x26B33	
+0x2864	0x26B34	
+0x2865	0x2719B	
+0x2866	0x27223	
+0x2867	0x27224	
+0x2869	0x27225	
+0x286A	0x27227	
+0x286B	0x27616	
+0x286C	0x27CA0	
+0x286D	0x2846F	
+0x286F	0x28470	
+0x2870	0x28471	
+0x2873	0x28472	
+0x2874	0x28473	
+0x2875	0x28474	
+0x2876	0x2869C	
+0x2877	0x286AA	
+0x2878	0x2869D	
+0x2879	0x2869E	
+0x287B	0x286AB	
+0x287C	0x2869F	
+0x287D	0x28E35	
+0x287E	0x28E38	
+0x2921	0x2A38D	
+0x2922	0x20035	
+0x2923	0x20036	
+0x2924	0x25AEE	
+0x2925	0x200B4	
+0x2926	0x2A6C9	
+0x2927	0x20132	
+0x2928	0x20155	
+0x2929	0x20244	
+0x292A	0x20245	
+0x292B	0x20246	
+0x292C	0x20247	
+0x292E	0x20248	
+0x292F	0x20249	
+0x2931	0x2024A	
+0x2932	0x2024B	
+0x2933	0x2024C	
+0x2934	0x2024D	
+0x2935	0x2024E	
+0x2936	0x2024F	
+0x2937	0x20250	
+0x2938	0x20251	
+0x2939	0x26299	
+0x293A	0x205D1	
+0x293C	0x205D2	
+0x293D	0x205D3	
+0x293E	0x205D4	
+0x293F	0x205D5	
+0x2940	0x20721	
+0x2941	0x20722	
+0x2942	0x20723	
+0x2943	0x20868	
+0x2944	0x20869	
+0x2945	0x2086A	
+0x2946	0x208E2	
+0x2947	0x20945	
+0x2948	0x209EC	
+0x2949	0x209ED	
+0x294A	0x209EE	
+0x294B	0x209EF	
+0x294D	0x20A62	
+0x294E	0x20A63	
+0x294F	0x20AF4	
+0x2950	0x2006F	
+0x2951	0x20B44	
+0x2952	0x20B45	
+0x2953	0x20C79	
+0x2955	0x20C7A	
+0x2956	0x20C7B	
+0x2957	0x20C7C	
+0x2958	0x20C7D	
+0x2959	0x20C7E	
+0x295A	0x20C7F	
+0x295B	0x20C80	
+0x295E	0x20C81	
+0x295F	0x20C82	
+0x2960	0x20C83	
+0x2961	0x20C84	
+0x2962	0x20C85	
+0x2963	0x20C86	
+0x2964	0x20C87	
+0x2965	0x20C8F	
+0x2966	0x20C88	
+0x2967	0x20C89	
+0x2968	0x212C5	
+0x2969	0x212C6	
+0x296B	0x212C7	
+0x296C	0x212C8	
+0x296D	0x212C9	
+0x296E	0x212CA	
+0x296F	0x212CB	
+0x2970	0x212CC	
+0x2972	0x212CD	
+0x2973	0x212CE	
+0x2974	0x212E3	
+0x2975	0x212CF	
+0x2976	0x212D0	
+0x2977	0x212D1	
+0x2978	0x212D2	
+0x2979	0x212D3	
+0x297A	0x212C4	
+0x297B	0x212D4	
+0x297C	0x212D5	
+0x297D	0x212D6	
+0x297E	0x21520	
+0x2A21	0x21521	
+0x2A22	0x2161A	
+0x2A23	0x21612	
+0x2A24	0x21614	
+0x2A25	0x21615	
+0x2A26	0x21616	
+0x2A27	0x21619	
+0x2A28	0x21617	
+0x2A29	0x21618	
+0x2A2B	0x2F861	
+0x2A2D	0x21712	
+0x2A2E	0x21713	
+0x2A2F	0x21714	
+0x2A30	0x21715	
+0x2A31	0x21716	
+0x2A32	0x21717	
+0x2A33	0x21718	
+0x2A34	0x21719	
+0x2A35	0x21961	
+0x2A36	0x21962	
+0x2A37	0x21963	
+0x2A38	0x219F5	
+0x2A3A	0x219F6	
+0x2A3B	0x219F7	
+0x2A3C	0x219F8	
+0x2A3D	0x21B29	
+0x2A3F	0x21C5D	
+0x2A40	0x21C57	
+0x2A41	0x21C58	
+0x2A42	0x21C59	
+0x2A43	0x21C5A	
+0x2A44	0x21C5B	
+0x2A45	0x21DBB	
+0x2A46	0x21DD1	
+0x2A47	0x21DBC	
+0x2A48	0x21DBD	
+0x2A49	0x268DF	
+0x2A4A	0x21DD0	
+0x2A4B	0x21DBE	
+0x2A4C	0x21DBF	
+0x2A4D	0x21DC0	
+0x2A4E	0x21DC1	
+0x2A4F	0x21DC2	
+0x2A50	0x21DC3	
+0x2A51	0x21DC4	
+0x2A52	0x26B6C	
+0x2A53	0x220A1	
+0x2A54	0x220A2	
+0x2A55	0x220A3	
+0x2A56	0x22193	
+0x2A57	0x2220D	
+0x2A58	0x2220F	
+0x2A59	0x2220E	
+0x2A5A	0x22210	
+0x2A5B	0x22211	
+0x2A5C	0x22212	
+0x2A5D	0x2F895	
+0x2A5E	0x224E5	
+0x2A5F	0x2262F	
+0x2A61	0x22657	
+0x2A62	0x22630	
+0x2A63	0x22668	
+0x2A64	0x2262B	
+0x2A65	0x22631	
+0x2A66	0x22658	
+0x2A67	0x2F8A2	
+0x2A68	0x22632	
+0x2A69	0x22659	
+0x2A6B	0x2265A	
+0x2A6C	0x22633	
+0x2A6D	0x2265B	
+0x2A6E	0x2265C	
+0x2A6F	0x2265D	
+0x2A70	0x2261E	
+0x2A71	0x229AE	
+0x2A72	0x229AF	
+0x2A73	0x22A3B	
+0x2A74	0x22A3C	
+0x2A75	0x22A3D	
+0x2A76	0x22B07	
+0x2A77	0x22B08	
+0x2A78	0x22B09	
+0x2A79	0x22B0A	
+0x2A7A	0x22B0B	
+0x2A7B	0x22B0C	
+0x2A7C	0x22B0D	
+0x2A7D	0x22B0E	
+0x2A7E	0x22B0F	
+0x2B21	0x22B10	
+0x2B22	0x22B22	
+0x2B23	0x22B11	
+0x2B24	0x22B12	
+0x2B25	0x22B13	
+0x2B26	0x22B14	
+0x2B27	0x22B15	
+0x2B28	0x22B16	
+0x2B29	0x22B17	
+0x2B2A	0x22B18	
+0x2B2B	0x2F8B8	
+0x2B2D	0x23046	
+0x2B2E	0x23047	
+0x2B2F	0x23048	
+0x2B30	0x230E1	
+0x2B31	0x23181	
+0x2B32	0x23183	
+0x2B33	0x20C75	
+0x2B35	0x23185	
+0x2B36	0x23186	
+0x2B37	0x2332A	
+0x2B38	0x2F8D1	
+0x2B39	0x2332B	
+0x2B3A	0x2336B	
+0x2B3B	0x23418	
+0x2B3C	0x23419	
+0x2B3D	0x2341A	
+0x2B3F	0x2341B	
+0x2B40	0x2341C	
+0x2B41	0x2341D	
+0x2B42	0x2341E	
+0x2B43	0x2341F	
+0x2B44	0x23420	
+0x2B45	0x23421	
+0x2B46	0x23422	
+0x2B47	0x23423	
+0x2B49	0x23424	
+0x2B4A	0x23425	
+0x2B4B	0x23426	
+0x2B4C	0x23427	
+0x2B4D	0x23428	
+0x2B4E	0x23429	
+0x2B4F	0x2342A	
+0x2B50	0x239EF	
+0x2B51	0x23B49	
+0x2B52	0x23B4A	
+0x2B53	0x23B4B	
+0x2B54	0x23B4C	
+0x2B55	0x23B4D	
+0x2B56	0x23B4E	
+0x2B57	0x23B4F	
+0x2B58	0x23B50	
+0x2B59	0x23B51	
+0x2B5A	0x23B52	
+0x2B5B	0x23B53	
+0x2B5C	0x23B54	
+0x2B5D	0x23B5A	
+0x2B5E	0x23B55	
+0x2B5F	0x23C5F	
+0x2B60	0x23D02	
+0x2B61	0x23D03	
+0x2B62	0x23D04	
+0x2B63	0x23D05	
+0x2B64	0x23CD5	
+0x2B65	0x23D06	
+0x2B66	0x23D07	
+0x2B67	0x23CD6	
+0x2B68	0x23D08	
+0x2B69	0x23D09	
+0x2B6A	0x23D0A	
+0x2B6B	0x23D0B	
+0x2B6C	0x23CD7	
+0x2B6D	0x23D0C	
+0x2B6E	0x23D0D	
+0x2B6F	0x241C8	
+0x2B70	0x241C9	
+0x2B71	0x241CA	
+0x2B72	0x241CB	
+0x2B73	0x241CC	
+0x2B74	0x241CD	
+0x2B75	0x241CE	
+0x2B76	0x241CF	
+0x2B77	0x241D0	
+0x2B78	0x241D1	
+0x2B79	0x241D2	
+0x2B7B	0x241D3	
+0x2B7C	0x241D4	
+0x2B7D	0x241D5	
+0x2B7E	0x241D6	
+0x2C21	0x241D7	
+0x2C22	0x241E2	
+0x2C23	0x241D8	
+0x2C24	0x24504	
+0x2C25	0x24505	
+0x2C26	0x24506	
+0x2C28	0x24643	
+0x2C29	0x24644	
+0x2C2A	0x24784	
+0x2C2B	0x2478F	
+0x2C2C	0x24785	
+0x2C2D	0x24786	
+0x2C2E	0x2492F	
+0x2C2F	0x2491A	
+0x2C30	0x2491B	
+0x2C31	0x2491C	
+0x2C33	0x2491D	
+0x2C34	0x2491E	
+0x2C35	0x2491F	
+0x2C36	0x24920	
+0x2C37	0x24921	
+0x2C38	0x24922	
+0x2C39	0x2F92C	
+0x2C3A	0x24923	
+0x2C3B	0x24924	
+0x2C3C	0x2490E	
+0x2C3D	0x24925	
+0x2C3E	0x2492B	
+0x2C3F	0x2492C	
+0x2C40	0x2490B	
+0x2C41	0x24AEE	
+0x2C43	0x24BC3	
+0x2C44	0x24BD8	
+0x2C45	0x24BD9	
+0x2C46	0x24C38	
+0x2C47	0x24C39	
+0x2C48	0x24C3A	
+0x2C49	0x24C3B	
+0x2C4B	0x24C3C	
+0x2C4C	0x24C3D	
+0x2C4D	0x24C3E	
+0x2C4E	0x24C3F	
+0x2C4F	0x24C40	
+0x2C50	0x24D48	
+0x2C51	0x24D4C	
+0x2C52	0x24F28	
+0x2C53	0x24F51	
+0x2C54	0x24F52	
+0x2C55	0x2504C	
+0x2C56	0x25123	
+0x2C57	0x2F945	
+0x2C58	0x25124	
+0x2C59	0x25431	
+0x2C5A	0x25432	
+0x2C5B	0x25433	
+0x2C5D	0x25434	
+0x2C5E	0x25435	
+0x2C5F	0x25436	
+0x2C60	0x25440	
+0x2C61	0x25437	
+0x2C63	0x25438	
+0x2C64	0x2543D	
+0x2C65	0x25638	
+0x2C66	0x25639	
+0x2C67	0x2563A	
+0x2C68	0x2563B	
+0x2C69	0x2563C	
+0x2C6A	0x2564C	
+0x2C6B	0x25773	
+0x2C6C	0x25774	
+0x2C6E	0x25775	
+0x2C6F	0x25776	
+0x2C70	0x25779	
+0x2C71	0x25941	
+0x2C72	0x25942	
+0x2C73	0x25943	
+0x2C74	0x25A5B	
+0x2C77	0x238A6	
+0x2C78	0x25A5C	
+0x2C79	0x25AE5	
+0x2C7A	0x25AE6	
+0x2C7B	0x25AE7	
+0x2C7C	0x25AE8	
+0x2C7D	0x25AED	
+0x2C7E	0x25E30	
+0x2D22	0x25E31	
+0x2D23	0x25F94	
+0x2D24	0x26351	
+0x2D25	0x263FD	
+0x2D26	0x263FE	
+0x2D27	0x264E9	
+0x2D29	0x266B3	
+0x2D2A	0x26684	
+0x2D2B	0x26694	
+0x2D2D	0x2669C	
+0x2D2F	0x26685	
+0x2D30	0x26900	
+0x2D31	0x26937	
+0x2D32	0x26957	
+0x2D33	0x26B54	
+0x2D34	0x26B68	
+0x2D35	0x26B55	
+0x2D36	0x26B5C	
+0x2D37	0x26B56	
+0x2D38	0x26B57	
+0x2D39	0x26B58	
+0x2D3A	0x26B59	
+0x2D3B	0x26B5A	
+0x2D3C	0x26B5B	
+0x2D3D	0x27234	
+0x2D3F	0x27235	
+0x2D41	0x27239	
+0x2D42	0x27236	
+0x2D43	0x27237	
+0x2D44	0x27238	
+0x2D45	0x275E5	
+0x2D46	0x27659	
+0x2D48	0x2763A	
+0x2D49	0x2763B	
+0x2D4A	0x27D28	
+0x2D4B	0x27E89	
+0x2D4D	0x27E8A	
+0x2D4E	0x27E8B	
+0x2D4F	0x27E8C	
+0x2D50	0x27E8D	
+0x2D51	0x27FBC	
+0x2D52	0x282A3	
+0x2D54	0x282A4	
+0x2D55	0x28493	
+0x2D56	0x28494	
+0x2D57	0x28495	
+0x2D58	0x28496	
+0x2D59	0x28497	
+0x2D5A	0x286B9	
+0x2D5B	0x28E4F	
+0x2D5C	0x28E50	
+0x2D5D	0x28E51	
+0x2D5E	0x29076	
+0x2D60	0x200FB	
+0x2D61	0x20083	
+0x2D62	0x20138	
+0x2D63	0x2015D	
+0x2D64	0x20271	
+0x2D66	0x20277	
+0x2D67	0x20278	
+0x2D68	0x2F807	
+0x2D69	0x202C3	
+0x2D6A	0x20279	
+0x2D6B	0x2027A	
+0x2D6C	0x2027B	
+0x2D6D	0x2027C	
+0x2D6E	0x20272	
+0x2D6F	0x2027D	
+0x2D70	0x202A0	
+0x2D71	0x2027E	
+0x2D72	0x2027F	
+0x2D73	0x20280	
+0x2D74	0x20281	
+0x2D75	0x20282	
+0x2D76	0x20283	
+0x2D77	0x2029E	
+0x2D78	0x20284	
+0x2D79	0x20285	
+0x2D7A	0x20286	
+0x2D7B	0x20287	
+0x2D7C	0x20288	
+0x2D7D	0x20493	
+0x2D7E	0x20494	
+0x2E21	0x20495	
+0x2E22	0x204EF	
+0x2E23	0x204F0	
+0x2E25	0x2058D	
+0x2E26	0x2058F	
+0x2E27	0x20590	
+0x2E28	0x20591	
+0x2E29	0x20592	
+0x2E2A	0x205DE	
+0x2E2B	0x205E1	
+0x2E2C	0x20653	
+0x2E2E	0x2074A	
+0x2E2F	0x2074B	
+0x2E30	0x2074C	
+0x2E31	0x20751	
+0x2E32	0x2074D	
+0x2E33	0x20748	
+0x2E34	0x20874	
+0x2E35	0x20875	
+0x2E36	0x20920	
+0x2E37	0x20921	
+0x2E38	0x209A5	
+0x2E39	0x209A6	
+0x2E3A	0x20A73	
+0x2E3B	0x20A74	
+0x2E3C	0x20B50	
+0x2E3D	0x20B51	
+0x2E3E	0x20B52	
+0x2E3F	0x20B53	
+0x2E40	0x20CDB	
+0x2E41	0x20CDC	
+0x2E43	0x20CDD	
+0x2E44	0x20CDE	
+0x2E45	0x20CFF	
+0x2E48	0x20CDF	
+0x2E49	0x20CE0	
+0x2E4B	0x20CE1	
+0x2E4C	0x20CE2	
+0x2E4D	0x20CE3	
+0x2E4E	0x20CE4	
+0x2E4F	0x20CE5	
+0x2E50	0x20CE6	
+0x2E51	0x20CE7	
+0x2E52	0x20CE8	
+0x2E53	0x20CE9	
+0x2E54	0x20CEA	
+0x2E55	0x21307	
+0x2E56	0x21308	
+0x2E57	0x21309	
+0x2E58	0x2130A	
+0x2E59	0x2130B	
+0x2E5A	0x2130C	
+0x2E5B	0x2130D	
+0x2E5D	0x2131A	
+0x2E5E	0x2130E	
+0x2E5F	0x2130F	
+0x2E60	0x21310	
+0x2E61	0x2131C	
+0x2E62	0x21527	
+0x2E63	0x21566	
+0x2E64	0x21598	
+0x2E65	0x21599	
+0x2E66	0x21633	
+0x2E67	0x21624	
+0x2E68	0x21625	
+0x2E69	0x21626	
+0x2E6C	0x2173E	
+0x2E6D	0x2F864	
+0x2E6E	0x2173F	
+0x2E6F	0x21757	
+0x2E70	0x21740	
+0x2E71	0x21741	
+0x2E72	0x21758	
+0x2E73	0x21742	
+0x2E74	0x21743	
+0x2E75	0x21744	
+0x2E76	0x21745	
+0x2E77	0x21746	
+0x2E79	0x21747	
+0x2E7A	0x2196B	
+0x2E7B	0x2196C	
+0x2E7C	0x21A10	
+0x2E7D	0x21A11	
+0x2F21	0x21B75	
+0x2F22	0x21BEF	
+0x2F23	0x21C6A	
+0x2F24	0x21C6B	
+0x2F26	0x21C6C	
+0x2F27	0x21C6D	
+0x2F28	0x21C6E	
+0x2F29	0x21DEF	
+0x2F2A	0x21DF0	
+0x2F2B	0x21DF1	
+0x2F2C	0x21DF2	
+0x2F2D	0x21DF3	
+0x2F2E	0x21DF4	
+0x2F2F	0x21DF5	
+0x2F30	0x21DFF	
+0x2F31	0x21DF6	
+0x2F32	0x21E02	
+0x2F33	0x21DF7	
+0x2F34	0x22022	
+0x2F35	0x220C4	
+0x2F36	0x220C3	
+0x2F37	0x22228	
+0x2F39	0x22320	
+0x2F3A	0x22325	
+0x2F3B	0x22322	
+0x2F3C	0x22323	
+0x2F3D	0x223EB	
+0x2F3F	0x224F9	
+0x2F40	0x224FA	
+0x2F41	0x22699	
+0x2F42	0x2269A	
+0x2F43	0x2269B	
+0x2F44	0x22663	
+0x2F46	0x2265E	
+0x2F47	0x2265F	
+0x2F48	0x22660	
+0x2F49	0x2269C	
+0x2F4A	0x22661	
+0x2F4B	0x2269D	
+0x2F4C	0x22B54	
+0x2F4D	0x22B55	
+0x2F4E	0x22B56	
+0x2F4F	0x22B57	
+0x2F50	0x22B58	
+0x2F51	0x22B59	
+0x2F52	0x22B5A	
+0x2F53	0x22B19	
+0x2F54	0x22B6A	
+0x2F55	0x22B5B	
+0x2F56	0x22B5C	
+0x2F57	0x22B5D	
+0x2F58	0x22B66	
+0x2F5A	0x22B5E	
+0x2F5B	0x22B5F	
+0x2F5C	0x22B1A	
+0x2F5D	0x22B60	
+0x2F5E	0x22B61	
+0x2F60	0x22B62	
+0x2F61	0x22B1B	
+0x2F62	0x22B63	
+0x2F63	0x26410	
+0x2F64	0x26411	
+0x2F65	0x2304C	
+0x2F66	0x2309B	
+0x2F67	0x230EB	
+0x2F68	0x230EC	
+0x2F69	0x230ED	
+0x2F6A	0x230EE	
+0x2F6B	0x231A3	
+0x2F6C	0x231A8	
+0x2F6D	0x231A6	
+0x2F6F	0x2332F	
+0x2F70	0x23330	
+0x2F71	0x23331	
+0x2F72	0x23332	
+0x2F73	0x23333	
+0x2F74	0x2344F	
+0x2F75	0x23451	
+0x2F76	0x23452	
+0x2F77	0x2347D	
+0x2F78	0x23453	
+0x2F79	0x23454	
+0x2F7A	0x23455	
+0x2F7B	0x23456	
+0x2F7C	0x23457	
+0x2F7D	0x23458	
+0x2F7E	0x23459	
+0x3021	0x2345A	
+0x3022	0x2345B	
+0x3023	0x2345C	
+0x3025	0x2345D	
+0x3026	0x2345E	
+0x3027	0x2345F	
+0x3028	0x2346F	
+0x3029	0x23460	
+0x302A	0x23461	
+0x302B	0x23462	
+0x302C	0x23463	
+0x302D	0x23472	
+0x302E	0x23464	
+0x3030	0x2346E	
+0x3031	0x238B5	
+0x3032	0x23B65	
+0x3033	0x23B66	
+0x3034	0x23B67	
+0x3035	0x23B68	
+0x3036	0x23B69	
+0x3037	0x23B6A	
+0x3038	0x23B6B	
+0x3039	0x23B6C	
+0x303A	0x23D0E	
+0x303B	0x23D43	
+0x303D	0x23D0F	
+0x303E	0x23D44	
+0x303F	0x23D45	
+0x3040	0x23D46	
+0x3041	0x23D47	
+0x3042	0x23D48	
+0x3043	0x23D49	
+0x3044	0x23D10	
+0x3045	0x23D4A	
+0x3046	0x23D4B	
+0x3047	0x23D4C	
+0x3048	0x23D4D	
+0x304A	0x23D4E	
+0x304B	0x23D4F	
+0x304C	0x23D50	
+0x304D	0x23D51	
+0x304E	0x23D52	
+0x304F	0x23D53	
+0x3050	0x23D54	
+0x3051	0x23D55	
+0x3052	0x23D56	
+0x3053	0x23D57	
+0x3054	0x23D58	
+0x3055	0x23D59	
+0x3056	0x23D5A	
+0x3057	0x23D1D	
+0x3058	0x23D5B	
+0x3059	0x23D5C	
+0x305A	0x23D5D	
+0x305B	0x2F906	
+0x305D	0x241FE	
+0x305E	0x241FF	
+0x305F	0x24200	
+0x3060	0x24201	
+0x3061	0x24202	
+0x3062	0x24203	
+0x3063	0x24204	
+0x3064	0x24205	
+0x3065	0x24206	
+0x3066	0x24207	
+0x3067	0x24218	
+0x3068	0x24208	
+0x3069	0x24209	
+0x306A	0x241F3	
+0x306B	0x2420A	
+0x306C	0x2420B	
+0x306D	0x2421B	
+0x306E	0x2420C	
+0x306F	0x2420D	
+0x3070	0x2420E	
+0x3071	0x2420F	
+0x3072	0x24210	
+0x3073	0x2450F	
+0x3074	0x24561	
+0x3075	0x24579	
+0x3076	0x247C1	
+0x3077	0x247AC	
+0x3078	0x247AD	
+0x3079	0x24943	
+0x307A	0x24944	
+0x307B	0x24945	
+0x307C	0x24946	
+0x307D	0x24947	
+0x307E	0x24948	
+0x3121	0x24949	
+0x3122	0x24964	
+0x3123	0x2494A	
+0x3124	0x2494B	
+0x3125	0x2494C	
+0x3126	0x2494D	
+0x3128	0x2F92D	
+0x3129	0x24B39	
+0x312A	0x24C57	
+0x312B	0x24C58	
+0x312C	0x24C59	
+0x312D	0x24C5F	
+0x312E	0x24C5A	
+0x312F	0x24D6A	
+0x3130	0x24F2B	
+0x3131	0x24F5D	
+0x3132	0x24F5E	
+0x3133	0x24F5F	
+0x3135	0x24F60	
+0x3136	0x24F61	
+0x3137	0x25058	
+0x3138	0x25059	
+0x3139	0x2514A	
+0x313A	0x2514B	
+0x313B	0x2514C	
+0x313C	0x2514D	
+0x313D	0x2514E	
+0x313E	0x25457	
+0x313F	0x253B3	
+0x3140	0x253B4	
+0x3141	0x2546E	
+0x3142	0x2545B	
+0x3143	0x2545C	
+0x3145	0x2545D	
+0x3146	0x2545E	
+0x3148	0x2546C	
+0x3149	0x2563D	
+0x314A	0x25654	
+0x314B	0x2563E	
+0x314C	0x25655	
+0x314D	0x25656	
+0x314E	0x2563F	
+0x314F	0x25657	
+0x3150	0x25658	
+0x3151	0x25659	
+0x3152	0x2565A	
+0x3153	0x2565B	
+0x3154	0x2565C	
+0x3155	0x25788	
+0x3156	0x25789	
+0x3158	0x25958	
+0x3159	0x25959	
+0x315A	0x2595A	
+0x315C	0x25A67	
+0x315D	0x25A68	
+0x315E	0x25A69	
+0x315F	0x25A6A	
+0x3161	0x25A6B	
+0x3162	0x25A6C	
+0x3163	0x25AFE	
+0x3164	0x25AFF	
+0x3165	0x25B00	
+0x3166	0x25B01	
+0x3167	0x25B02	
+0x3168	0x25B03	
+0x3169	0x25B04	
+0x316A	0x25B05	
+0x316B	0x25E39	
+0x316C	0x25E3A	
+0x316D	0x25E3B	
+0x316E	0x25E3C	
+0x3171	0x25FB2	
+0x3172	0x25FB3	
+0x3173	0x25FB4	
+0x3174	0x25FB5	
+0x3175	0x25FB6	
+0x3176	0x25FB7	
+0x3177	0x25FB8	
+0x3179	0x262A2	
+0x317A	0x26361	
+0x317B	0x26362	
+0x317C	0x26414	
+0x317E	0x264EB	
+0x3221	0x26542	
+0x3222	0x26548	
+0x3224	0x26543	
+0x3225	0x2654E	
+0x3226	0x26544	
+0x3227	0x26545	
+0x3228	0x266B4	
+0x3229	0x266B5	
+0x322D	0x266B6	
+0x322F	0x268E1	
+0x3230	0x26905	
+0x3233	0x26B9A	
+0x3235	0x26B9B	
+0x3236	0x26B9C	
+0x3237	0x26B9D	
+0x3238	0x26B9E	
+0x3239	0x26B9F	
+0x323A	0x2F99A	
+0x323B	0x26BA0	
+0x323C	0x26BA1	
+0x323D	0x26BA2	
+0x323E	0x26BB5	
+0x323F	0x26BA3	
+0x3240	0x26BA4	
+0x3242	0x26BA5	
+0x3243	0x26BA6	
+0x3244	0x26BA7	
+0x3245	0x26BA8	
+0x3246	0x26BAF	
+0x3247	0x26BA9	
+0x3248	0x26BAA	
+0x3249	0x26BAB	
+0x324A	0x26BAC	
+0x324B	0x26BAD	
+0x324C	0x26BB3	
+0x324E	0x271A0	
+0x324F	0x27256	
+0x3250	0x27634	
+0x3252	0x2763C	
+0x3253	0x2780C	
+0x3255	0x27C3E	
+0x3256	0x27CA3	
+0x3257	0x27D30	
+0x3258	0x27D31	
+0x3259	0x27E97	
+0x325A	0x27E98	
+0x325B	0x27E99	
+0x325C	0x27E9A	
+0x325D	0x27E9B	
+0x325E	0x282B2	
+0x325F	0x282AB	
+0x3260	0x282AC	
+0x3261	0x286FC	
+0x3262	0x286E8	
+0x3263	0x286E9	
+0x3264	0x286EA	
+0x3265	0x287F1	
+0x3266	0x2893F	
+0x3267	0x28CCE	
+0x3268	0x28E6D	
+0x3269	0x28E6E	
+0x326A	0x28E6F	
+0x326B	0x28E70	
+0x326C	0x28E71	
+0x326D	0x28E72	
+0x326E	0x28E73	
+0x3270	0x29078	
+0x3271	0x2983A	
+0x3272	0x20167	
+0x3274	0x20164	
+0x3275	0x20165	
+0x3276	0x20307	
+0x3277	0x202C4	
+0x3278	0x202C5	
+0x3279	0x202C6	
+0x327A	0x202C7	
+0x327B	0x202C8	
+0x327C	0x202C9	
+0x327D	0x202E5	
+0x327E	0x202CA	
+0x3321	0x202CB	
+0x3323	0x202CC	
+0x3324	0x202CD	
+0x3325	0x202CE	
+0x3326	0x202CF	
+0x3327	0x202D0	
+0x3328	0x20497	
+0x3329	0x2049A	
+0x332A	0x2049B	
+0x332B	0x205EA	
+0x332C	0x205EC	
+0x332D	0x205ED	
+0x332E	0x205F7	
+0x332F	0x205EE	
+0x3330	0x205EF	
+0x3331	0x2065B	
+0x3332	0x2065C	
+0x3333	0x2065D	
+0x3334	0x2076D	
+0x3335	0x2076E	
+0x3337	0x2076F	
+0x3338	0x20881	
+0x3339	0x20882	
+0x333A	0x2094F	
+0x333B	0x209AD	
+0x333C	0x2870A	
+0x333D	0x20A7E	
+0x333E	0x20B69	
+0x333F	0x20D54	
+0x3340	0x20D55	
+0x3341	0x20D56	
+0x3342	0x20D57	
+0x3344	0x20D58	
+0x3345	0x20D59	
+0x3346	0x20D5A	
+0x3347	0x20D5B	
+0x3348	0x20D5C	
+0x3349	0x20D5D	
+0x334C	0x20D5E	
+0x334D	0x20D5F	
+0x334E	0x2133B	
+0x334F	0x21336	
+0x3350	0x2133C	
+0x3351	0x2133D	
+0x3352	0x2133E	
+0x3353	0x2133F	
+0x3354	0x21340	
+0x3355	0x21341	
+0x3356	0x21342	
+0x3358	0x21343	
+0x3359	0x21344	
+0x335A	0x21345	
+0x335B	0x21337	
+0x335E	0x21346	
+0x335F	0x21347	
+0x3360	0x21348	
+0x3361	0x21349	
+0x3362	0x2152D	
+0x3363	0x215A5	
+0x3364	0x2163D	
+0x3365	0x2163F	
+0x3366	0x2196E	
+0x3367	0x217E7	
+0x3368	0x21775	
+0x3369	0x21776	
+0x336A	0x21777	
+0x336B	0x21778	
+0x336C	0x21779	
+0x336D	0x2177A	
+0x336E	0x2177B	
+0x336F	0x2177C	
+0x3370	0x2178E	
+0x3371	0x2177D	
+0x3372	0x2177E	
+0x3374	0x2177F	
+0x3375	0x21780	
+0x3376	0x21781	
+0x3377	0x21782	
+0x3378	0x21783	
+0x3379	0x21784	
+0x337A	0x21785	
+0x337B	0x21786	
+0x337C	0x21787	
+0x337D	0x21788	
+0x337E	0x21789	
+0x3421	0x2178A	
+0x3422	0x2178B	
+0x3423	0x2178C	
+0x3424	0x2196F	
+0x3425	0x21970	
+0x3426	0x21971	
+0x3427	0x21972	
+0x3428	0x21A2A	
+0x3429	0x21A2B	
+0x342A	0x21A2C	
+0x342B	0x21A2D	
+0x342C	0x21A2E	
+0x342D	0x21A2F	
+0x342E	0x21A30	
+0x342F	0x21A31	
+0x3430	0x21B83	
+0x3431	0x21C84	
+0x3432	0x21C85	
+0x3433	0x21C93	
+0x3435	0x21C86	
+0x3436	0x21C87	
+0x3437	0x21C88	
+0x3438	0x21C89	
+0x3439	0x21C8A	
+0x343A	0x21C8B	
+0x343B	0x21E36	
+0x343C	0x21E38	
+0x343D	0x21E39	
+0x343E	0x21E3A	
+0x3440	0x21E3B	
+0x3441	0x21E3C	
+0x3442	0x21E3D	
+0x3443	0x21E3E	
+0x3444	0x21E3F	
+0x3446	0x21E40	
+0x3447	0x21E41	
+0x3448	0x21E42	
+0x3449	0x220DE	
+0x344A	0x220DF	
+0x344B	0x220E0	
+0x344C	0x220E1	
+0x344D	0x2224A	
+0x344E	0x2224B	
+0x344F	0x2224C	
+0x3450	0x2224D	
+0x3451	0x2224E	
+0x3452	0x2224F	
+0x3453	0x22250	
+0x3454	0x22327	
+0x3455	0x223F9	
+0x3456	0x223FA	
+0x3457	0x223FB	
+0x3458	0x22498	
+0x3459	0x22499	
+0x345A	0x2249A	
+0x345C	0x2251E	
+0x345D	0x2269E	
+0x345E	0x226F7	
+0x345F	0x2269F	
+0x3460	0x226A0	
+0x3461	0x226F0	
+0x3462	0x226F8	
+0x3463	0x226F9	
+0x3464	0x226A1	
+0x3465	0x226A2	
+0x3466	0x226A3	
+0x3467	0x226A4	
+0x3468	0x226A5	
+0x3469	0x226FA	
+0x346A	0x226FB	
+0x346B	0x226FC	
+0x346C	0x226FD	
+0x346D	0x226FE	
+0x346E	0x2271F	
+0x346F	0x226FF	
+0x3470	0x22700	
+0x3471	0x2278C	
+0x3472	0x22701	
+0x3473	0x229C2	
+0x3474	0x229C3	
+0x3476	0x229D3	
+0x3477	0x22A4E	
+0x3478	0x22BAF	
+0x3479	0x22BB0	
+0x347A	0x22BB1	
+0x347B	0x22BB2	
+0x347C	0x22BB3	
+0x347D	0x22BC6	
+0x347E	0x22BB4	
+0x3522	0x22BB5	
+0x3523	0x22BB6	
+0x3524	0x22BB7	
+0x3525	0x22BB8	
+0x3526	0x22BB9	
+0x3527	0x22BBA	
+0x3528	0x22BBB	
+0x3529	0x22BBC	
+0x352A	0x22BBD	
+0x352B	0x22BBE	
+0x352C	0x22BBF	
+0x352D	0x22BC1	
+0x352E	0x22BC0	
+0x352F	0x22BC2	
+0x3530	0x22BC3	
+0x3531	0x22F51	
+0x3532	0x22F52	
+0x3533	0x22F53	
+0x3534	0x22F54	
+0x3535	0x22F55	
+0x3536	0x2305A	
+0x3537	0x23050	
+0x3538	0x23051	
+0x3539	0x23078	
+0x353A	0x230F8	
+0x353B	0x230F9	
+0x353C	0x231C6	
+0x353D	0x231CB	
+0x353E	0x231CC	
+0x353F	0x231CD	
+0x3540	0x231CE	
+0x3541	0x231CF	
+0x3542	0x231D0	
+0x3543	0x231D1	
+0x3544	0x231D2	
+0x3545	0x231D3	
+0x3546	0x231D4	
+0x3547	0x231D5	
+0x3549	0x23337	
+0x354A	0x23338	
+0x354B	0x23373	
+0x354C	0x23490	
+0x354D	0x23491	
+0x354E	0x234BF	
+0x354F	0x23492	
+0x3550	0x23493	
+0x3551	0x23494	
+0x3552	0x23495	
+0x3553	0x23496	
+0x3554	0x23497	
+0x3555	0x23498	
+0x3556	0x23499	
+0x3558	0x2349A	
+0x3559	0x2349B	
+0x355A	0x2349C	
+0x355B	0x2349D	
+0x355C	0x2349E	
+0x355D	0x2349F	
+0x355E	0x234A0	
+0x355F	0x234A1	
+0x3560	0x234A2	
+0x3561	0x234A3	
+0x3562	0x234A4	
+0x3563	0x234A5	
+0x3565	0x234A6	
+0x3566	0x234A7	
+0x3567	0x238BF	
+0x3568	0x238C0	
+0x3569	0x238C1	
+0x356A	0x238C2	
+0x356B	0x238C3	
+0x356C	0x238C4	
+0x356D	0x238C5	
+0x356E	0x238C6	
+0x356F	0x23975	
+0x3570	0x23A43	
+0x3571	0x23A12	
+0x3572	0x23A9F	
+0x3573	0x23A91	
+0x3574	0x2F8F6	
+0x3575	0x23A92	
+0x3576	0x23A93	
+0x3577	0x23A94	
+0x3578	0x23B7E	
+0x3579	0x23B7F	
+0x357A	0x23B80	
+0x357B	0x23B81	
+0x357C	0x23B82	
+0x357D	0x23C4C	
+0x357E	0x23C63	
+0x3621	0x23DC0	
+0x3622	0x23DC1	
+0x3623	0x23DC2	
+0x3624	0x2423A	
+0x3625	0x23DC3	
+0x3626	0x23DC4	
+0x3627	0x23DC5	
+0x3628	0x23DC6	
+0x362A	0x23DC7	
+0x362C	0x23DC8	
+0x362D	0x23D73	
+0x362E	0x23DC9	
+0x362F	0x23DCA	
+0x3630	0x23DCB	
+0x3631	0x23DCC	
+0x3632	0x23DCD	
+0x3636	0x23DCE	
+0x3637	0x23DCF	
+0x3638	0x23DD0	
+0x3639	0x23DD1	
+0x363A	0x23DD2	
+0x363B	0x23DD3	
+0x363C	0x23DD4	
+0x363D	0x23DD5	
+0x363E	0x2423B	
+0x363F	0x2423C	
+0x3640	0x2423D	
+0x3641	0x2423E	
+0x3643	0x2423F	
+0x3644	0x24240	
+0x3645	0x24241	
+0x3646	0x24242	
+0x3647	0x24243	
+0x3649	0x24244	
+0x364A	0x24245	
+0x364B	0x24259	
+0x364C	0x24246	
+0x364D	0x24247	
+0x364E	0x24248	
+0x3650	0x24249	
+0x3651	0x24513	
+0x3652	0x24582	
+0x3653	0x24583	
+0x3654	0x24666	
+0x3655	0x24667	
+0x3656	0x24965	
+0x3658	0x24966	
+0x365A	0x24975	
+0x365B	0x24974	
+0x365C	0x24967	
+0x365D	0x2496D	
+0x365E	0x24976	
+0x365F	0x24968	
+0x3660	0x24969	
+0x3661	0x2496A	
+0x3662	0x2496B	
+0x3663	0x2494F	
+0x3664	0x2496C	
+0x3665	0x24AF8	
+0x3666	0x24B45	
+0x3668	0x24B46	
+0x3669	0x24BE4	
+0x366A	0x24C85	
+0x366B	0x24C6F	
+0x366C	0x24C70	
+0x366D	0x24D82	
+0x366E	0x24D83	
+0x366F	0x24D84	
+0x3670	0x24D8B	
+0x3671	0x24F2D	
+0x3672	0x24F68	
+0x3673	0x24F69	
+0x3674	0x24F77	
+0x3675	0x24F64	
+0x3676	0x24F6A	
+0x3678	0x24FF2	
+0x3679	0x24FE2	
+0x367A	0x25063	
+0x367B	0x25064	
+0x367C	0x25065	
+0x367D	0x25066	
+0x3721	0x25067	
+0x3722	0x25068	
+0x3725	0x25172	
+0x3726	0x2517D	
+0x3727	0x25369	
+0x3728	0x25484	
+0x3729	0x25486	
+0x372A	0x25487	
+0x372B	0x25488	
+0x372C	0x2549E	
+0x372E	0x25489	
+0x372F	0x2548A	
+0x3730	0x25496	
+0x3731	0x2548B	
+0x3732	0x2548C	
+0x3733	0x2548D	
+0x3734	0x25679	
+0x3735	0x25683	
+0x3736	0x2567A	
+0x3737	0x2565D	
+0x3738	0x2567B	
+0x373A	0x2579F	
+0x373C	0x257A0	
+0x373D	0x257A1	
+0x373E	0x257A2	
+0x3740	0x2596A	
+0x3741	0x2596B	
+0x3742	0x2596C	
+0x3743	0x2596D	
+0x3744	0x2596E	
+0x3745	0x25A78	
+0x3747	0x25A79	
+0x3748	0x25A7C	
+0x3749	0x25B21	
+0x374A	0x25B22	
+0x374B	0x25B23	
+0x374C	0x25B24	
+0x374E	0x25B25	
+0x374F	0x25B26	
+0x3750	0x25E51	
+0x3751	0x25E52	
+0x3752	0x25E56	
+0x3755	0x25FE1	
+0x3758	0x25FD6	
+0x3759	0x25FD7	
+0x375A	0x25FD8	
+0x375B	0x25FD9	
+0x375C	0x262B5	
+0x375D	0x2636C	
+0x375E	0x2636F	
+0x375F	0x26370	
+0x3760	0x264BC	
+0x3761	0x264BD	
+0x3762	0x264ED	
+0x3763	0x2655B	
+0x3764	0x2655C	
+0x3765	0x2655D	
+0x3766	0x2655E	
+0x3767	0x26686	
+0x3768	0x26687	
+0x3769	0x266ED	
+0x376B	0x266EE	
+0x376D	0x2690E	
+0x376E	0x2690F	
+0x3770	0x26A2D	
+0x3771	0x26A2A	
+0x3772	0x26A2E	
+0x3773	0x26ACC	
+0x3774	0x26BF9	
+0x3775	0x26BFA	
+0x3776	0x26BFB	
+0x3777	0x26BFC	
+0x3779	0x26BFD	
+0x377A	0x26C1B	
+0x377B	0x26BFE	
+0x377C	0x26BFF	
+0x377D	0x26C00	
+0x377E	0x26C01	
+0x3821	0x26C02	
+0x3822	0x26C03	
+0x3823	0x26C21	
+0x3824	0x26C04	
+0x3825	0x26C05	
+0x3826	0x26C06	
+0x3827	0x26C07	
+0x3828	0x26C08	
+0x3829	0x26C09	
+0x382A	0x26C0A	
+0x382B	0x26C0B	
+0x382C	0x26C0C	
+0x382D	0x26C0D	
+0x382E	0x26C0E	
+0x382F	0x26C0F	
+0x3830	0x26C10	
+0x3831	0x26C11	
+0x3832	0x26C12	
+0x3833	0x26C13	
+0x3834	0x26C14	
+0x3835	0x26C15	
+0x3836	0x2727B	
+0x3837	0x2727C	
+0x3838	0x2727D	
+0x3839	0x2727E	
+0x383B	0x2727F	
+0x383C	0x27280	
+0x383D	0x27266	
+0x383E	0x27281	
+0x383F	0x27282	
+0x3840	0x27283	
+0x3841	0x275B2	
+0x3843	0x2767F	
+0x3844	0x27672	
+0x3845	0x2765A	
+0x3846	0x277EB	
+0x3847	0x27815	
+0x3849	0x27816	
+0x384A	0x2F9CA	
+0x384B	0x27817	
+0x384D	0x278C5	
+0x384E	0x278C6	
+0x384F	0x278C7	
+0x3850	0x27988	
+0x3851	0x27989	
+0x3853	0x2798A	
+0x3854	0x2798B	
+0x3855	0x2798C	
+0x3856	0x2798D	
+0x3857	0x27BDF	
+0x3859	0x27D3B	
+0x385A	0x27D3C	
+0x385B	0x27D3D	
+0x385C	0x27D3E	
+0x385D	0x27D3F	
+0x385E	0x27D40	
+0x385F	0x27D41	
+0x3860	0x27D42	
+0x3861	0x27E5C	
+0x3862	0x27EAF	
+0x3863	0x27EA9	
+0x3864	0x27EAA	
+0x3865	0x27EAB	
+0x3866	0x27EAC	
+0x3867	0x27EB5	
+0x3868	0x27EAD	
+0x3869	0x27EAE	
+0x386A	0x27FE2	
+0x386B	0x28224	
+0x386D	0x282C4	
+0x386F	0x284EA	
+0x3870	0x284D3	
+0x3871	0x284D4	
+0x3872	0x284D5	
+0x3873	0x28686	
+0x3875	0x28687	
+0x3876	0x286FD	
+0x3877	0x28805	
+0x3878	0x28949	
+0x3879	0x28C5F	
+0x387A	0x28CD3	
+0x387B	0x28CD5	
+0x387C	0x28E8A	
+0x387D	0x28E8B	
+0x387E	0x28E8C	
+0x3921	0x28E8D	
+0x3922	0x28E8E	
+0x3923	0x28E8F	
+0x3924	0x28E90	
+0x3925	0x28E91	
+0x3926	0x28E92	
+0x3927	0x28E93	
+0x3928	0x2907D	
+0x3929	0x2907E	
+0x392D	0x291EC	
+0x392E	0x2925B	
+0x392F	0x29C87	
+0x3930	0x29C86	
+0x3932	0x20046	
+0x3933	0x20047	
+0x3934	0x20102	
+0x3935	0x2016D	
+0x3936	0x2016E	
+0x3937	0x2016F	
+0x3938	0x2030D	
+0x3939	0x2030E	
+0x393A	0x2030F	
+0x393B	0x20310	
+0x393C	0x20311	
+0x393D	0x20312	
+0x393E	0x20313	
+0x393F	0x20314	
+0x3940	0x2049F	
+0x3941	0x204A0	
+0x3942	0x204A1	
+0x3943	0x204A3	
+0x3944	0x20521	
+0x3945	0x20522	
+0x3946	0x2337C	
+0x3947	0x20595	
+0x3948	0x20596	
+0x3949	0x20661	
+0x394A	0x20667	
+0x394B	0x20791	
+0x394C	0x20792	
+0x394D	0x20793	
+0x394E	0x20794	
+0x394F	0x2088A	
+0x3950	0x2088B	
+0x3951	0x208F7	
+0x3952	0x20924	
+0x3953	0x209B0	
+0x3954	0x209B1	
+0x3955	0x20A8E	
+0x3956	0x20B04	
+0x3957	0x20B6A	
+0x3958	0x20B6B	
+0x3959	0x20B6C	
+0x395A	0x20B6D	
+0x395B	0x20DE8	
+0x395C	0x20E0C	
+0x395D	0x20DE9	
+0x395E	0x20DEA	
+0x395F	0x20E0D	
+0x3961	0x20DEB	
+0x3962	0x20DEC	
+0x3963	0x20DED	
+0x3964	0x20DEE	
+0x3965	0x20DEF	
+0x3966	0x20DF0	
+0x3967	0x20DF1	
+0x3968	0x20DF2	
+0x3969	0x20E16	
+0x396A	0x20DF3	
+0x396B	0x20E04	
+0x396C	0x20E1D	
+0x396D	0x20DF4	
+0x396E	0x20DF5	
+0x396F	0x20DF6	
+0x3970	0x20DF7	
+0x3972	0x21202	
+0x3973	0x21203	
+0x3974	0x21204	
+0x3975	0x2139A	
+0x3976	0x2137C	
+0x3977	0x213C5	
+0x3978	0x2137D	
+0x3979	0x2137E	
+0x397A	0x2137F	
+0x397B	0x21380	
+0x397C	0x21381	
+0x3A21	0x21382	
+0x3A22	0x21383	
+0x3A23	0x21384	
+0x3A24	0x21385	
+0x3A25	0x21386	
+0x3A26	0x21387	
+0x3A27	0x215AE	
+0x3A28	0x2164D	
+0x3A29	0x217B0	
+0x3A2A	0x217DC	
+0x3A2B	0x217B6	
+0x3A2C	0x217B7	
+0x3A2D	0x217B8	
+0x3A2E	0x217B9	
+0x3A2F	0x217BA	
+0x3A30	0x217BB	
+0x3A31	0x217DB	
+0x3A32	0x217BC	
+0x3A33	0x217BD	
+0x3A34	0x217BE	
+0x3A36	0x217BF	
+0x3A37	0x217C0	
+0x3A38	0x217C1	
+0x3A39	0x217C2	
+0x3A3A	0x217C3	
+0x3A3B	0x217CE	
+0x3A3D	0x217D9	
+0x3A3E	0x217C4	
+0x3A3F	0x217C5	
+0x3A40	0x217DA	
+0x3A41	0x217C6	
+0x3A42	0x217C7	
+0x3A43	0x217C8	
+0x3A44	0x217C9	
+0x3A45	0x217CA	
+0x3A46	0x2197E	
+0x3A47	0x2197B	
+0x3A48	0x21A4E	
+0x3A49	0x21A4F	
+0x3A4A	0x21A50	
+0x3A4B	0x21A51	
+0x3A4C	0x21A52	
+0x3A4D	0x21A53	
+0x3A4E	0x21A54	
+0x3A4F	0x21A55	
+0x3A50	0x21B8F	
+0x3A51	0x21BFC	
+0x3A52	0x21CA6	
+0x3A53	0x21CA7	
+0x3A54	0x21CA8	
+0x3A55	0x21D23	
+0x3A56	0x21E8B	
+0x3A58	0x21E8C	
+0x3A59	0x21E8D	
+0x3A5A	0x21E8E	
+0x3A5B	0x21E8F	
+0x3A5C	0x21EA4	
+0x3A5D	0x20599	
+0x3A5E	0x22024	
+0x3A5F	0x22046	
+0x3A60	0x22047	
+0x3A61	0x22048	
+0x3A62	0x220FD	
+0x3A63	0x220FE	
+0x3A65	0x2226E	
+0x3A66	0x2227C	
+0x3A67	0x2226F	
+0x3A68	0x22270	
+0x3A69	0x22271	
+0x3A6A	0x22272	
+0x3A6B	0x22329	
+0x3A6C	0x2232A	
+0x3A6D	0x2235F	
+0x3A6E	0x224A2	
+0x3A6F	0x22530	
+0x3A70	0x2252B	
+0x3A71	0x22761	
+0x3A72	0x22702	
+0x3A73	0x22703	
+0x3A74	0x22704	
+0x3A75	0x22705	
+0x3A76	0x22706	
+0x3A77	0x22707	
+0x3A79	0x22708	
+0x3A7A	0x22709	
+0x3A7B	0x22762	
+0x3A7C	0x2270A	
+0x3A7D	0x2270B	
+0x3A7E	0x2270C	
+0x3B21	0x2270D	
+0x3B22	0x2270E	
+0x3B23	0x22763	
+0x3B24	0x22727	
+0x3B25	0x2270F	
+0x3B27	0x2271B	
+0x3B28	0x22764	
+0x3B29	0x22710	
+0x3B2A	0x22711	
+0x3B2B	0x22781	
+0x3B2C	0x22712	
+0x3B2D	0x22765	
+0x3B2E	0x22713	
+0x3B2F	0x229CE	
+0x3B30	0x22C29	
+0x3B31	0x22BC4	
+0x3B32	0x22C2A	
+0x3B34	0x22C2B	
+0x3B35	0x22C2C	
+0x3B36	0x22C2D	
+0x3B37	0x22C2E	
+0x3B38	0x22C2F	
+0x3B39	0x22C30	
+0x3B3A	0x22C31	
+0x3B3B	0x22C32	
+0x3B3C	0x22C33	
+0x3B3D	0x22C34	
+0x3B3F	0x22C35	
+0x3B40	0x22C36	
+0x3B41	0x22BE3	
+0x3B42	0x22C37	
+0x3B43	0x22C38	
+0x3B44	0x22C39	
+0x3B45	0x22C3A	
+0x3B46	0x22C3B	
+0x3B47	0x22C4D	
+0x3B48	0x22C3C	
+0x3B49	0x22C3D	
+0x3B4A	0x22C3E	
+0x3B4C	0x22ED0	
+0x3B4D	0x22ED1	
+0x3B4E	0x23055	
+0x3B4F	0x23102	
+0x3B50	0x23104	
+0x3B51	0x231FC	
+0x3B52	0x23207	
+0x3B53	0x231FD	
+0x3B54	0x231FE	
+0x3B56	0x231FF	
+0x3B57	0x23200	
+0x3B58	0x23208	
+0x3B59	0x23201	
+0x3B5A	0x23202	
+0x3B5B	0x23235	
+0x3B5C	0x23203	
+0x3B5D	0x23204	
+0x3B5F	0x2333B	
+0x3B60	0x23389	
+0x3B61	0x23381	
+0x3B62	0x23382	
+0x3B63	0x26733	
+0x3B64	0x234EB	
+0x3B65	0x234EC	
+0x3B67	0x234ED	
+0x3B68	0x234EE	
+0x3B69	0x234EF	
+0x3B6B	0x234F0	
+0x3B6C	0x234F1	
+0x3B6D	0x234F2	
+0x3B6F	0x234F3	
+0x3B71	0x234F4	
+0x3B72	0x234F5	
+0x3B73	0x2004B	
+0x3B74	0x234F6	
+0x3B75	0x234F7	
+0x3B76	0x234F8	
+0x3B77	0x234F9	
+0x3B78	0x234FA	
+0x3B79	0x234FB	
+0x3B7A	0x234FC	
+0x3B7B	0x234FD	
+0x3B7C	0x234FE	
+0x3B7D	0x234FF	
+0x3B7E	0x23500	
+0x3C22	0x23501	
+0x3C23	0x23502	
+0x3C24	0x23503	
+0x3C25	0x23504	
+0x3C26	0x23505	
+0x3C27	0x23506	
+0x3C28	0x23507	
+0x3C2A	0x23508	
+0x3C2B	0x23509	
+0x3C2C	0x2350A	
+0x3C2D	0x2350B	
+0x3C2E	0x2350C	
+0x3C2F	0x2350D	
+0x3C30	0x238D7	
+0x3C31	0x238D8	
+0x3C32	0x23A29	
+0x3C33	0x23A9C	
+0x3C34	0x23AF8	
+0x3C35	0x23B98	
+0x3C36	0x23BA4	
+0x3C37	0x23B99	
+0x3C38	0x23B9A	
+0x3C39	0x23B9B	
+0x3C3A	0x23B97	
+0x3C3B	0x23B9C	
+0x3C3D	0x23B9D	
+0x3C3F	0x23B9E	
+0x3C40	0x23B9F	
+0x3C41	0x23C65	
+0x3C42	0x23DD6	
+0x3C44	0x23E32	
+0x3C45	0x23E33	
+0x3C46	0x23E34	
+0x3C48	0x23E35	
+0x3C49	0x23E36	
+0x3C4A	0x23E37	
+0x3C4B	0x23DD7	
+0x3C4D	0x23DD8	
+0x3C4E	0x23E38	
+0x3C4F	0x23E39	
+0x3C50	0x23E3A	
+0x3C51	0x23E3B	
+0x3C52	0x23E3C	
+0x3C53	0x23E3D	
+0x3C54	0x23E3E	
+0x3C55	0x23E3F	
+0x3C56	0x23E40	
+0x3C57	0x23DD9	
+0x3C58	0x23E41	
+0x3C59	0x23E42	
+0x3C5B	0x23E43	
+0x3C5C	0x23E44	
+0x3C5E	0x2427C	
+0x3C5F	0x2427D	
+0x3C60	0x2427E	
+0x3C61	0x2427F	
+0x3C62	0x24280	
+0x3C63	0x24281	
+0x3C64	0x24282	
+0x3C66	0x24283	
+0x3C67	0x24284	
+0x3C68	0x24285	
+0x3C69	0x24286	
+0x3C6A	0x242A5	
+0x3C6B	0x24287	
+0x3C6C	0x24288	
+0x3C6D	0x24289	
+0x3C6E	0x2428A	
+0x3C6F	0x2428B	
+0x3C70	0x2428C	
+0x3C71	0x2428D	
+0x3C72	0x2428E	
+0x3C75	0x2428F	
+0x3C77	0x24290	
+0x3C78	0x24291	
+0x3C79	0x24292	
+0x3C7A	0x24293	
+0x3C7B	0x24294	
+0x3C7C	0x24295	
+0x3D21	0x24296	
+0x3D22	0x24556	
+0x3D23	0x24557	
+0x3D24	0x245E1	
+0x3D25	0x2460E	
+0x3D26	0x2460F	
+0x3D27	0x2467A	
+0x3D28	0x2467B	
+0x3D29	0x2468B	
+0x3D2A	0x247F2	
+0x3D2B	0x247F3	
+0x3D2C	0x24993	
+0x3D2D	0x24994	
+0x3D2E	0x24995	
+0x3D2F	0x24996	
+0x3D30	0x24997	
+0x3D31	0x249AD	
+0x3D32	0x24998	
+0x3D33	0x249AB	
+0x3D34	0x2497B	
+0x3D35	0x24999	
+0x3D36	0x2499A	
+0x3D37	0x2499B	
+0x3D38	0x24985	
+0x3D39	0x2499C	
+0x3D3A	0x2499D	
+0x3D3D	0x249AC	
+0x3D3E	0x24979	
+0x3D3F	0x2499E	
+0x3D40	0x249A4	
+0x3D41	0x24AFD	
+0x3D42	0x24BEB	
+0x3D43	0x24BEA	
+0x3D44	0x24C8F	
+0x3D45	0x24C90	
+0x3D46	0x24C86	
+0x3D47	0x24C87	
+0x3D48	0x24C88	
+0x3D49	0x24DAC	
+0x3D4A	0x24DAD	
+0x3D4B	0x24FEC	
+0x3D4C	0x25073	
+0x3D4D	0x25074	
+0x3D4F	0x251AA	
+0x3D50	0x251AB	
+0x3D51	0x251AC	
+0x3D52	0x253D1	
+0x3D53	0x253D7	
+0x3D54	0x254B9	
+0x3D55	0x254BA	
+0x3D56	0x254BB	
+0x3D57	0x254BC	
+0x3D58	0x2568E	
+0x3D59	0x2568F	
+0x3D5A	0x25690	
+0x3D5B	0x2567C	
+0x3D5C	0x25691	
+0x3D5D	0x25692	
+0x3D5E	0x25693	
+0x3D5F	0x25694	
+0x3D60	0x2F954	
+0x3D61	0x2569A	
+0x3D62	0x25695	
+0x3D63	0x25696	
+0x3D64	0x25697	
+0x3D65	0x257BD	
+0x3D66	0x257C7	
+0x3D67	0x257BE	
+0x3D69	0x257BF	
+0x3D6B	0x25993	
+0x3D6C	0x21A5E	
+0x3D6D	0x25A86	
+0x3D6E	0x25A87	
+0x3D6F	0x25A88	
+0x3D70	0x25A89	
+0x3D71	0x25B41	
+0x3D72	0x25B42	
+0x3D73	0x25B43	
+0x3D74	0x25B44	
+0x3D75	0x25B45	
+0x3D76	0x25B46	
+0x3D77	0x25B4A	
+0x3D78	0x25B47	
+0x3D79	0x25B48	
+0x3D7A	0x25B49	
+0x3D7B	0x25E6B	
+0x3D7C	0x25E66	
+0x3D7E	0x25E67	
+0x3E22	0x25E68	
+0x3E25	0x25FFD	
+0x3E26	0x25FFE	
+0x3E27	0x25FFF	
+0x3E28	0x26000	
+0x3E29	0x26001	
+0x3E2A	0x26002	
+0x3E2B	0x26003	
+0x3E2C	0x26004	
+0x3E2D	0x26005	
+0x3E2E	0x26006	
+0x3E2F	0x26233	
+0x3E30	0x262C2	
+0x3E31	0x262D0	
+0x3E32	0x2F974	
+0x3E33	0x26395	
+0x3E34	0x26396	
+0x3E35	0x26435	
+0x3E36	0x26436	
+0x3E37	0x26567	
+0x3E38	0x26568	
+0x3E39	0x26569	
+0x3E3A	0x2656A	
+0x3E3B	0x26572	
+0x3E3C	0x2656B	
+0x3E3D	0x2656C	
+0x3E3E	0x2656D	
+0x3E3F	0x2656E	
+0x3E40	0x2656F	
+0x3E41	0x26722	
+0x3E44	0x26723	
+0x3E45	0x26741	
+0x3E46	0x26724	
+0x3E47	0x26725	
+0x3E48	0x26726	
+0x3E49	0x26727	
+0x3E4A	0x26728	
+0x3E4B	0x26729	
+0x3E4C	0x266B7	
+0x3E50	0x269DA	
+0x3E51	0x26ACF	
+0x3E52	0x26ADA	
+0x3E53	0x26C89	
+0x3E54	0x26CB7	
+0x3E55	0x26C8A	
+0x3E56	0x26C8B	
+0x3E57	0x26D5E	
+0x3E58	0x26C8C	
+0x3E5A	0x26C8D	
+0x3E5B	0x26C8E	
+0x3E5C	0x26C8F	
+0x3E5D	0x26C90	
+0x3E5E	0x26C91	
+0x3E5F	0x26C92	
+0x3E60	0x26C93	
+0x3E61	0x26C94	
+0x3E62	0x26CB6	
+0x3E63	0x26C95	
+0x3E64	0x26C96	
+0x3E65	0x26C97	
+0x3E68	0x26C98	
+0x3E69	0x26C99	
+0x3E6A	0x26C9A	
+0x3E6D	0x26C9B	
+0x3E6E	0x26CBD	
+0x3E6F	0x26C9C	
+0x3E70	0x26C9D	
+0x3E71	0x26C9E	
+0x3E72	0x26C9F	
+0x3E73	0x26CC0	
+0x3E74	0x26CA0	
+0x3E75	0x26CA1	
+0x3E76	0x26CA2	
+0x3E77	0x26CA3	
+0x3E78	0x26CA4	
+0x3E79	0x26CA5	
+0x3E7A	0x26CA6	
+0x3E7B	0x26CA7	
+0x3E7C	0x26CA8	
+0x3E7D	0x26CA9	
+0x3E7E	0x26CAA	
+0x3F22	0x271B4	
+0x3F23	0x271B5	
+0x3F24	0x271B6	
+0x3F25	0x272B9	
+0x3F26	0x272BA	
+0x3F27	0x272BB	
+0x3F28	0x27291	
+0x3F29	0x272BC	
+0x3F2A	0x275EE	
+0x3F2B	0x275EF	
+0x3F2C	0x27696	
+0x3F2D	0x27697	
+0x3F2E	0x27673	
+0x3F2F	0x27698	
+0x3F30	0x27699	
+0x3F31	0x277ED	
+0x3F32	0x277EE	
+0x3F33	0x278DE	
+0x3F34	0x279B0	
+0x3F35	0x279B1	
+0x3F36	0x279B2	
+0x3F37	0x279B3	
+0x3F38	0x279B4	
+0x3F39	0x279B5	
+0x3F3A	0x279B6	
+0x3F3B	0x2F9CE	
+0x3F3C	0x279B7	
+0x3F3D	0x27BE3	
+0x3F3E	0x27CB9	
+0x3F3F	0x27D55	
+0x3F40	0x27D7E	
+0x3F41	0x27D56	
+0x3F42	0x27D57	
+0x3F43	0x27D58	
+0x3F44	0x27D59	
+0x3F45	0x27D5A	
+0x3F47	0x27EC4	
+0x3F48	0x27EC5	
+0x3F49	0x27EC6	
+0x3F4A	0x27EC7	
+0x3F4B	0x27EC8	
+0x3F4C	0x27EC9	
+0x3F4D	0x27EEE	
+0x3F4E	0x27ECF	
+0x3F4F	0x27ECA	
+0x3F50	0x27ECB	
+0x3F51	0x27ECC	
+0x3F52	0x28009	
+0x3F53	0x2F9DA	
+0x3F54	0x28003	
+0x3F55	0x2822F	
+0x3F56	0x28230	
+0x3F57	0x28231	
+0x3F58	0x28232	
+0x3F59	0x2850E	
+0x3F5A	0x2850F	
+0x3F5B	0x28510	
+0x3F5C	0x28511	
+0x3F5D	0x28512	
+0x3F5F	0x28513	
+0x3F60	0x28514	
+0x3F61	0x28515	
+0x3F62	0x284FF	
+0x3F63	0x2871F	
+0x3F64	0x28720	
+0x3F65	0x28721	
+0x3F66	0x2872D	
+0x3F68	0x2881B	
+0x3F69	0x2881C	
+0x3F6A	0x2881D	
+0x3F6B	0x2881E	
+0x3F6C	0x28953	
+0x3F6D	0x28954	
+0x3F6E	0x28955	
+0x3F6F	0x28956	
+0x3F70	0x28964	
+0x3F71	0x28959	
+0x3F72	0x28957	
+0x3F74	0x28958	
+0x3F75	0x28C6B	
+0x3F78	0x28CE7	
+0x3F79	0x28CE8	
+0x3F7A	0x28CE9	
+0x3F7B	0x28CEA	
+0x3F7C	0x28CEB	
+0x3F7D	0x28CEC	
+0x4021	0x28CED	
+0x4022	0x28EB1	
+0x4023	0x28EB4	
+0x4025	0x2908A	
+0x4026	0x2908D	
+0x4027	0x2908C	
+0x4028	0x291F2	
+0x4029	0x291F3	
+0x402B	0x22108	
+0x402C	0x29417	
+0x402E	0x2959F	
+0x402F	0x296A0	
+0x4031	0x2986D	
+0x4032	0x2307D	
+0x4033	0x29F90	
+0x4034	0x2A5C4	
+0x4035	0x2004C	
+0x4036	0x20174	
+0x4037	0x20175	
+0x4038	0x20176	
+0x4039	0x20349	
+0x403A	0x2034A	
+0x403B	0x2034B	
+0x403C	0x2034C	
+0x403D	0x2034D	
+0x403E	0x2034E	
+0x403F	0x2034F	
+0x4040	0x20350	
+0x4041	0x20351	
+0x4042	0x20352	
+0x4043	0x20353	
+0x4044	0x20354	
+0x4045	0x20355	
+0x4046	0x20356	
+0x4047	0x204A4	
+0x4048	0x204A9	
+0x4049	0x2052A	
+0x404A	0x2052B	
+0x404B	0x207B3	
+0x404C	0x207C1	
+0x404D	0x20898	
+0x404E	0x208FB	
+0x404F	0x208FC	
+0x4050	0x209BC	
+0x4051	0x20A96	
+0x4052	0x20B0A	
+0x4054	0x20EA2	
+0x4056	0x20E81	
+0x4057	0x20E82	
+0x4058	0x20E83	
+0x4059	0x20E84	
+0x405A	0x20E85	
+0x405B	0x20E86	
+0x405C	0x20E87	
+0x405D	0x20E88	
+0x405E	0x20E89	
+0x405F	0x20E8A	
+0x4060	0x20E8B	
+0x4061	0x20E8C	
+0x4063	0x20E8D	
+0x4064	0x20ED1	
+0x4065	0x21214	
+0x4066	0x213C9	
+0x4067	0x213CA	
+0x4068	0x213CB	
+0x4069	0x29AFD	
+0x406A	0x213CC	
+0x406B	0x213CD	
+0x406C	0x213CE	
+0x406D	0x213CF	
+0x406E	0x213D0	
+0x406F	0x213D1	
+0x4070	0x213D2	
+0x4071	0x213D3	
+0x4072	0x213D4	
+0x4073	0x213D5	
+0x4074	0x21571	
+0x4075	0x2004D	
+0x4076	0x21662	
+0x4077	0x2180E	
+0x4078	0x217FE	
+0x4079	0x217FF	
+0x407A	0x21800	
+0x407C	0x21801	
+0x407D	0x21802	
+0x407E	0x21803	
+0x4121	0x21815	
+0x4122	0x21804	
+0x4123	0x21805	
+0x4125	0x21987	
+0x4126	0x21989	
+0x4127	0x21A6E	
+0x4128	0x21A6F	
+0x4129	0x21A70	
+0x412A	0x21A71	
+0x412B	0x2F86E	
+0x412C	0x21A72	
+0x412D	0x21A73	
+0x412E	0x21A74	
+0x412F	0x21B9D	
+0x4130	0x21CB8	
+0x4131	0x21CB9	
+0x4132	0x21CBA	
+0x4133	0x21EC2	
+0x4134	0x21EC3	
+0x4135	0x21ED5	
+0x4136	0x21EC4	
+0x4137	0x21EC0	
+0x4138	0x21EC5	
+0x4139	0x21EC6	
+0x413A	0x2228A	
+0x413B	0x2228B	
+0x413C	0x2228C	
+0x413D	0x22364	
+0x413E	0x25B8C	
+0x4140	0x2240D	
+0x4141	0x224A8	
+0x4142	0x2253B	
+0x4143	0x2253C	
+0x4144	0x2253D	
+0x4145	0x2253E	
+0x4146	0x2253F	
+0x4147	0x22540	
+0x4148	0x22766	
+0x4149	0x227CB	
+0x414A	0x227B7	
+0x414B	0x227B8	
+0x414C	0x227B9	
+0x414D	0x227BA	
+0x414E	0x22767	
+0x414F	0x227BB	
+0x4150	0x22768	
+0x4151	0x22769	
+0x4152	0x2276A	
+0x4153	0x227BC	
+0x4155	0x229DB	
+0x4156	0x22C81	
+0x4157	0x22C82	
+0x4158	0x22C83	
+0x4159	0x22C84	
+0x415A	0x22C85	
+0x415B	0x22C86	
+0x415C	0x22C87	
+0x415D	0x22C88	
+0x415E	0x22C89	
+0x415F	0x2F8BF	
+0x4160	0x22C8A	
+0x4161	0x22C8B	
+0x4163	0x22C8C	
+0x4164	0x22C8D	
+0x4165	0x22C8E	
+0x4166	0x22C8F	
+0x4167	0x22C90	
+0x4168	0x22CA1	
+0x4169	0x22C91	
+0x416A	0x22ED6	
+0x416B	0x22F9F	
+0x416C	0x23058	
+0x416D	0x23085	
+0x416E	0x2310B	
+0x416F	0x2310C	
+0x4170	0x23237	
+0x4171	0x23238	
+0x4172	0x2F8CE	
+0x4173	0x23239	
+0x4174	0x2323A	
+0x4175	0x2323B	
+0x4176	0x2323C	
+0x4177	0x2323D	
+0x4178	0x2323E	
+0x4179	0x23240	
+0x417A	0x23241	
+0x417B	0x23242	
+0x417D	0x23243	
+0x417E	0x2338A	
+0x4221	0x2338B	
+0x4222	0x23590	
+0x4223	0x23559	
+0x4224	0x2355B	
+0x4225	0x2355C	
+0x4226	0x2355D	
+0x4227	0x2355E	
+0x4229	0x2355F	
+0x422A	0x23560	
+0x422B	0x23561	
+0x422C	0x23562	
+0x422D	0x23563	
+0x422E	0x23564	
+0x422F	0x23593	
+0x4230	0x23565	
+0x4231	0x23566	
+0x4232	0x23567	
+0x4233	0x23568	
+0x4234	0x23569	
+0x4235	0x2356A	
+0x4236	0x2356B	
+0x4237	0x23595	
+0x4238	0x2356C	
+0x4239	0x2356D	
+0x423A	0x2356E	
+0x423B	0x2356F	
+0x423D	0x23570	
+0x423E	0x23571	
+0x423F	0x23572	
+0x4240	0x23573	
+0x4241	0x23574	
+0x4242	0x23575	
+0x4243	0x23576	
+0x4244	0x23577	
+0x4245	0x23578	
+0x4246	0x23579	
+0x4248	0x2357A	
+0x424A	0x2357B	
+0x424B	0x235A9	
+0x424C	0x2357C	
+0x424D	0x238F1	
+0x424E	0x238EB	
+0x424F	0x2398A	
+0x4250	0x23A3D	
+0x4251	0x23AA6	
+0x4252	0x23AA7	
+0x4253	0x23BBA	
+0x4255	0x23BBB	
+0x4256	0x23BBC	
+0x4257	0x23BBD	
+0x4258	0x23E91	
+0x4259	0x23E92	
+0x425A	0x23E93	
+0x425B	0x23E94	
+0x425C	0x23E95	
+0x425D	0x23E96	
+0x425E	0x23E97	
+0x425F	0x23DDA	
+0x4260	0x23E98	
+0x4261	0x23E99	
+0x4262	0x23E9A	
+0x4265	0x23E9B	
+0x4266	0x23E9C	
+0x4267	0x23E9D	
+0x4268	0x23E9E	
+0x4269	0x23E9F	
+0x426A	0x23EA0	
+0x426B	0x23EBF	
+0x426C	0x23EA1	
+0x426D	0x23EA2	
+0x426E	0x23EA3	
+0x426F	0x23EA4	
+0x4270	0x23EA5	
+0x4271	0x23EA6	
+0x4272	0x23EA7	
+0x4273	0x23E5B	
+0x4274	0x2F90D	
+0x4275	0x23EA8	
+0x4276	0x242CB	
+0x4279	0x242CC	
+0x427A	0x2434F	
+0x427B	0x242CD	
+0x427C	0x242CE	
+0x427D	0x242CF	
+0x427E	0x2434E	
+0x4321	0x242D0	
+0x4322	0x242D1	
+0x4323	0x242D2	
+0x4325	0x242D3	
+0x4326	0x242D4	
+0x4327	0x242D5	
+0x4328	0x242D6	
+0x4329	0x242D7	
+0x432A	0x242D8	
+0x432B	0x242D9	
+0x432C	0x242FA	
+0x432D	0x242DA	
+0x432E	0x242DB	
+0x432F	0x2F91C	
+0x4330	0x242DC	
+0x4333	0x242DD	
+0x4334	0x242DE	
+0x4335	0x242DF	
+0x4336	0x242E0	
+0x4337	0x242E1	
+0x4338	0x242E2	
+0x4339	0x242E3	
+0x433A	0x242E4	
+0x433B	0x242E5	
+0x433D	0x242E6	
+0x433E	0x242E7	
+0x433F	0x2458E	
+0x4340	0x24698	
+0x4341	0x24699	
+0x4343	0x2480A	
+0x4345	0x24826	
+0x4346	0x24827	
+0x4347	0x249BD	
+0x4348	0x249DF	
+0x434A	0x249BE	
+0x434B	0x249DE	
+0x434C	0x249BF	
+0x434D	0x249C0	
+0x434E	0x249C1	
+0x434F	0x249C2	
+0x4350	0x2499F	
+0x4351	0x249C3	
+0x4352	0x249C4	
+0x4353	0x249C5	
+0x4354	0x249C6	
+0x4355	0x249C7	
+0x4357	0x249C8	
+0x4358	0x249C9	
+0x4359	0x249E3	
+0x435A	0x249CA	
+0x435B	0x249CB	
+0x435C	0x249CC	
+0x435D	0x249CD	
+0x435E	0x249CE	
+0x435F	0x249CF	
+0x4360	0x249D0	
+0x4361	0x249D1	
+0x4362	0x249D2	
+0x4363	0x249D3	
+0x4364	0x2F92F	
+0x4365	0x249D4	
+0x4366	0x24B04	
+0x4367	0x24B65	
+0x4368	0x24BEE	
+0x4369	0x24CA0	
+0x436A	0x24CA1	
+0x436B	0x24DDD	
+0x436C	0x24DDE	
+0x436D	0x24F83	
+0x436E	0x24FFA	
+0x436F	0x2507F	
+0x4370	0x25080	
+0x4371	0x251E8	
+0x4372	0x251E9	
+0x4373	0x251EA	
+0x4374	0x235A6	
+0x4375	0x253E1	
+0x4377	0x254DB	
+0x4378	0x254DC	
+0x4379	0x254DD	
+0x437A	0x254DE	
+0x437B	0x254DF	
+0x437C	0x254E0	
+0x437D	0x254E1	
+0x437E	0x254E2	
+0x4421	0x254E3	
+0x4422	0x254E4	
+0x4423	0x254E5	
+0x4424	0x254E6	
+0x4426	0x254E7	
+0x4427	0x256B0	
+0x4428	0x25698	
+0x4429	0x256B1	
+0x442A	0x25699	
+0x442B	0x256B2	
+0x442C	0x256B3	
+0x442D	0x256B4	
+0x442E	0x256B5	
+0x442F	0x256B6	
+0x4430	0x256B7	
+0x4431	0x256B8	
+0x4432	0x256B9	
+0x4433	0x257E2	
+0x4434	0x257E3	
+0x4435	0x257E4	
+0x4436	0x257E5	
+0x4437	0x257E6	
+0x4438	0x257E7	
+0x4439	0x257E8	
+0x443A	0x257E9	
+0x443B	0x259AD	
+0x443C	0x259CF	
+0x443D	0x259AE	
+0x443E	0x259AF	
+0x443F	0x259B0	
+0x4440	0x259B1	
+0x4441	0x25A92	
+0x4442	0x25A93	
+0x4443	0x25A94	
+0x4444	0x25B79	
+0x4446	0x25B7A	
+0x4447	0x25B7B	
+0x4448	0x25B7C	
+0x4449	0x25B7D	
+0x444A	0x25B7E	
+0x444B	0x25B7F	
+0x444C	0x25B80	
+0x444D	0x25B81	
+0x444E	0x25B82	
+0x444F	0x25B83	
+0x4450	0x25B84	
+0x4451	0x25E97	
+0x4452	0x25E84	
+0x4453	0x25E85	
+0x4454	0x25E89	
+0x4455	0x25E86	
+0x4456	0x25E87	
+0x4457	0x2602C	
+0x4458	0x2602D	
+0x4459	0x2602E	
+0x445A	0x2602F	
+0x445B	0x26030	
+0x445C	0x26031	
+0x445D	0x26032	
+0x445E	0x26033	
+0x445F	0x26034	
+0x4460	0x26035	
+0x4461	0x26036	
+0x4462	0x26037	
+0x4463	0x262D2	
+0x4464	0x26444	
+0x4465	0x26500	
+0x4466	0x26583	
+0x4467	0x26584	
+0x4468	0x2F986	
+0x4469	0x2677A	
+0x446A	0x2677B	
+0x446B	0x2677C	
+0x446C	0x2677D	
+0x446D	0x2677E	
+0x446F	0x2677F	
+0x4470	0x26787	
+0x4471	0x26780	
+0x4472	0x26A43	
+0x4473	0x26D34	
+0x4475	0x26D35	
+0x4476	0x26D36	
+0x4477	0x26D37	
+0x4478	0x26D38	
+0x4479	0x26D39	
+0x447A	0x26D3A	
+0x447B	0x26D3B	
+0x447C	0x26D3C	
+0x447D	0x26D3D	
+0x447E	0x26D3E	
+0x4521	0x26D3F	
+0x4522	0x26D40	
+0x4523	0x26D41	
+0x4524	0x26D42	
+0x4525	0x26D43	
+0x4526	0x26D44	
+0x4527	0x26D45	
+0x4528	0x26D46	
+0x4529	0x26D47	
+0x452A	0x26D48	
+0x452B	0x26D49	
+0x452C	0x26D4A	
+0x452E	0x26D4B	
+0x452F	0x26D4C	
+0x4530	0x26D4D	
+0x4531	0x26D4E	
+0x4532	0x272E7	
+0x4533	0x272E8	
+0x4534	0x272E9	
+0x4535	0x272EA	
+0x4536	0x272EB	
+0x4537	0x272EC	
+0x4538	0x272ED	
+0x4539	0x272EE	
+0x453A	0x275F7	
+0x453B	0x2769A	
+0x453C	0x276CD	
+0x453D	0x2F9C8	
+0x453E	0x276A3	
+0x453F	0x276CE	
+0x4540	0x27831	
+0x4541	0x27832	
+0x4542	0x27833	
+0x4543	0x279E4	
+0x4545	0x279E5	
+0x4546	0x279E6	
+0x4547	0x27CC8	
+0x4548	0x27D74	
+0x4549	0x27D75	
+0x454A	0x27D76	
+0x454B	0x27D77	
+0x454C	0x27D78	
+0x454D	0x27D79	
+0x454E	0x27D7A	
+0x454F	0x27E61	
+0x4550	0x27EDF	
+0x4551	0x27EE0	
+0x4552	0x27EE1	
+0x4553	0x27EE2	
+0x4554	0x27EE3	
+0x4555	0x27EE4	
+0x4556	0x27EE5	
+0x4557	0x27EE6	
+0x4559	0x28031	
+0x455A	0x2823D	
+0x455B	0x2823E	
+0x455C	0x2823F	
+0x455D	0x282F4	
+0x455E	0x282F5	
+0x455F	0x282F6	
+0x4561	0x28417	
+0x4562	0x28541	
+0x4563	0x28542	
+0x4564	0x28543	
+0x4565	0x28544	
+0x4566	0x28545	
+0x4567	0x28546	
+0x4568	0x28547	
+0x4569	0x28548	
+0x456A	0x28549	
+0x456B	0x2854A	
+0x456C	0x2854B	
+0x456E	0x286BA	
+0x456F	0x28744	
+0x4570	0x2892A	
+0x4571	0x2896D	
+0x4573	0x2F9E7	
+0x4574	0x2897E	
+0x4575	0x2896E	
+0x4576	0x2896F	
+0x4577	0x28970	
+0x4578	0x28971	
+0x4579	0x28976	
+0x457A	0x28C79	
+0x457D	0x28D04	
+0x457E	0x28CF8	
+0x4621	0x28D05	
+0x4622	0x28EDA	
+0x4623	0x28EDB	
+0x4624	0x28EDC	
+0x4625	0x28EDD	
+0x4626	0x28EDE	
+0x4627	0x28EDF	
+0x4628	0x28EE0	
+0x4629	0x28EE1	
+0x462A	0x290C5	
+0x462B	0x2909A	
+0x462C	0x2909B	
+0x462D	0x2909C	
+0x462E	0x291D8	
+0x462F	0x291D9	
+0x4630	0x291DA	
+0x4631	0x2926E	
+0x4633	0x2946B	
+0x4634	0x27D83	
+0x4636	0x296D6	
+0x4637	0x296BD	
+0x4639	0x2322E	
+0x463A	0x29AFC	
+0x463B	0x29D53	
+0x463C	0x29DB7	
+0x463D	0x2A28C	
+0x463E	0x2A38E	
+0x463F	0x2A2FF	
+0x4640	0x20076	
+0x4641	0x20106	
+0x4642	0x2017E	
+0x4643	0x20384	
+0x4644	0x20385	
+0x4645	0x20386	
+0x4646	0x20387	
+0x4647	0x20388	
+0x4648	0x203A7	
+0x4649	0x20389	
+0x464A	0x2038A	
+0x464B	0x2038B	
+0x464C	0x2038C	
+0x464D	0x2038D	
+0x464E	0x2038E	
+0x464F	0x2038F	
+0x4650	0x203A3	
+0x4651	0x20390	
+0x4652	0x20391	
+0x4653	0x20392	
+0x4654	0x20393	
+0x4655	0x203AC	
+0x4656	0x20394	
+0x4657	0x20395	
+0x4658	0x20396	
+0x4659	0x204AA	
+0x465A	0x204AB	
+0x465B	0x2059E	
+0x465D	0x20608	
+0x465E	0x20609	
+0x465F	0x20668	
+0x4660	0x20669	
+0x4661	0x2066A	
+0x4662	0x2069A	
+0x4663	0x207D9	
+0x4664	0x207DA	
+0x4665	0x207DB	
+0x4666	0x208A8	
+0x4667	0x20901	
+0x4668	0x20928	
+0x4669	0x20977	
+0x466A	0x209BD	
+0x466B	0x209BE	
+0x466C	0x20F60	
+0x466D	0x20AA0	
+0x466E	0x20AA2	
+0x466F	0x20B0F	
+0x4670	0x20B85	
+0x4671	0x20EFE	
+0x4672	0x20EFF	
+0x4673	0x20F00	
+0x4674	0x20F01	
+0x4675	0x20F16	
+0x4676	0x20F02	
+0x4677	0x20F03	
+0x4678	0x20F04	
+0x4679	0x20F05	
+0x467A	0x20F06	
+0x467B	0x20F07	
+0x467C	0x20F08	
+0x467D	0x20F22	
+0x467E	0x20F09	
+0x4721	0x20F0A	
+0x4722	0x20F0B	
+0x4723	0x20F0C	
+0x4724	0x20F14	
+0x4725	0x20F29	
+0x4726	0x20E6E	
+0x4727	0x20F0D	
+0x4728	0x20F0E	
+0x4729	0x20F0F	
+0x472A	0x20F10	
+0x472B	0x20F11	
+0x472C	0x20F12	
+0x472D	0x20F13	
+0x472E	0x2121B	
+0x472F	0x2121C	
+0x4730	0x2121D	
+0x4731	0x21413	
+0x4732	0x213FF	
+0x4733	0x21400	
+0x4734	0x21401	
+0x4735	0x21402	
+0x4736	0x21403	
+0x4737	0x21404	
+0x4738	0x2140A	
+0x4739	0x21405	
+0x473A	0x21406	
+0x473B	0x21407	
+0x473C	0x21408	
+0x473D	0x2153A	
+0x473E	0x21573	
+0x473F	0x2166F	
+0x4740	0x21670	
+0x4741	0x21671	
+0x4742	0x20052	
+0x4744	0x21A9A	
+0x4745	0x21860	
+0x4746	0x2F869	
+0x4747	0x2182B	
+0x4748	0x21824	
+0x4749	0x2182C	
+0x474A	0x2182D	
+0x474B	0x2182E	
+0x474C	0x2182F	
+0x474D	0x21830	
+0x474E	0x21831	
+0x474F	0x21832	
+0x4750	0x21833	
+0x4751	0x21834	
+0x4752	0x21835	
+0x4753	0x21845	
+0x4754	0x21836	
+0x4755	0x21992	
+0x4756	0x21993	
+0x4757	0x21A88	
+0x4758	0x21A89	
+0x4759	0x21A8A	
+0x475A	0x21A8B	
+0x475B	0x21B3F	
+0x475D	0x21CCA	
+0x475E	0x21EF6	
+0x475F	0x21EF7	
+0x4760	0x21EF8	
+0x4761	0x21EF9	
+0x4762	0x2212B	
+0x4764	0x221A4	
+0x4765	0x221CE	
+0x4767	0x2229E	
+0x4768	0x2229F	
+0x4769	0x222A0	
+0x476A	0x222A1	
+0x476B	0x222A2	
+0x476C	0x222A3	
+0x476D	0x222A4	
+0x476E	0x222A5	
+0x476F	0x222A6	
+0x4770	0x22418	
+0x4771	0x22560	
+0x4772	0x22561	
+0x4773	0x22562	
+0x4774	0x22563	
+0x4775	0x22564	
+0x4776	0x227BD	
+0x4777	0x227BE	
+0x4778	0x2280B	
+0x4779	0x227BF	
+0x477A	0x227C0	
+0x477C	0x2280C	
+0x477D	0x2278D	
+0x477E	0x2280D	
+0x4821	0x2280E	
+0x4822	0x2285E	
+0x4823	0x2280F	
+0x4824	0x22810	
+0x4825	0x227C1	
+0x4826	0x22811	
+0x4828	0x227C2	
+0x4829	0x229EA	
+0x482A	0x229EB	
+0x482B	0x22CE3	
+0x482C	0x22CE4	
+0x482D	0x22CE5	
+0x482E	0x22CE6	
+0x482F	0x22CE7	
+0x4830	0x22C92	
+0x4831	0x22D4A	
+0x4833	0x22CE8	
+0x4834	0x22CE9	
+0x4835	0x22CEA	
+0x4836	0x22D01	
+0x4837	0x22CEB	
+0x4838	0x22CEC	
+0x4839	0x22CEF	
+0x483A	0x22CED	
+0x483B	0x22CEE	
+0x483C	0x22CF0	
+0x483D	0x22CF1	
+0x483E	0x22CF2	
+0x483F	0x22CF3	
+0x4840	0x22CF4	
+0x4841	0x22CF5	
+0x4842	0x22CF6	
+0x4843	0x22CF7	
+0x4844	0x22CF8	
+0x4845	0x22CF9	
+0x4846	0x22CFE	
+0x4847	0x22CFA	
+0x4848	0x22CFB	
+0x4849	0x22CFC	
+0x484A	0x23263	
+0x484B	0x23264	
+0x484C	0x23265	
+0x484D	0x23266	
+0x484E	0x23267	
+0x484F	0x23268	
+0x4850	0x2360B	
+0x4851	0x2360D	
+0x4853	0x2360E	
+0x4854	0x2360F	
+0x4856	0x23614	
+0x4857	0x235D4	
+0x4858	0x235D5	
+0x4859	0x235D6	
+0x485A	0x235D7	
+0x485B	0x235D8	
+0x485C	0x235D9	
+0x485D	0x235DA	
+0x485E	0x235DB	
+0x485F	0x235DC	
+0x4860	0x235DD	
+0x4861	0x235DE	
+0x4862	0x235DF	
+0x4863	0x235E0	
+0x4864	0x235E1	
+0x4865	0x235E2	
+0x4866	0x235E3	
+0x4867	0x235E4	
+0x4868	0x235E5	
+0x4869	0x235E6	
+0x486A	0x235E7	
+0x486B	0x235E8	
+0x486C	0x235E9	
+0x486D	0x235EA	
+0x486E	0x235EB	
+0x486F	0x235EC	
+0x4870	0x236EC	
+0x4871	0x235ED	
+0x4872	0x235EE	
+0x4873	0x235EF	
+0x4874	0x23600	
+0x4875	0x235F0	
+0x4876	0x23904	
+0x4878	0x23905	
+0x4879	0x2F8F3	
+0x487A	0x23AB5	
+0x487B	0x2F8F9	
+0x487C	0x23BD6	
+0x487D	0x23BD7	
+0x487E	0x23BD8	
+0x4921	0x23BD9	
+0x4922	0x23EA9	
+0x4923	0x23F00	
+0x4924	0x23F01	
+0x4925	0x23F02	
+0x4926	0x23F03	
+0x4927	0x23F04	
+0x4928	0x23F05	
+0x4929	0x23F06	
+0x492A	0x23F3F	
+0x492B	0x23F07	
+0x492C	0x23F08	
+0x492D	0x23F09	
+0x492E	0x23F0A	
+0x492F	0x23EB6	
+0x4930	0x23F0B	
+0x4931	0x23F0C	
+0x4934	0x23F0D	
+0x4936	0x23F0E	
+0x4937	0x23F0F	
+0x4938	0x23F10	
+0x4939	0x23F11	
+0x493A	0x23F12	
+0x493B	0x23F35	
+0x493C	0x23F13	
+0x493D	0x23F14	
+0x493E	0x23EAA	
+0x4940	0x23FC1	
+0x4941	0x23F15	
+0x4942	0x23F16	
+0x4943	0x23F17	
+0x4944	0x2431E	
+0x4945	0x2431F	
+0x4946	0x24320	
+0x4947	0x24321	
+0x4949	0x24322	
+0x494A	0x24323	
+0x494C	0x24324	
+0x494D	0x24325	
+0x494E	0x24326	
+0x494F	0x24327	
+0x4950	0x24328	
+0x4951	0x24329	
+0x4952	0x2432A	
+0x4953	0x2432B	
+0x4954	0x24307	
+0x4955	0x2432C	
+0x4956	0x2432D	
+0x4957	0x2432E	
+0x495A	0x2432F	
+0x495B	0x24330	
+0x495C	0x24348	
+0x495D	0x24331	
+0x495E	0x24332	
+0x4960	0x24333	
+0x4962	0x24334	
+0x4963	0x24335	
+0x4964	0x24336	
+0x4965	0x24559	
+0x4966	0x24591	
+0x4967	0x245E7	
+0x4968	0x246B8	
+0x4969	0x246B9	
+0x496A	0x246BA	
+0x496B	0x246BB	
+0x496C	0x246C8	
+0x496D	0x2484D	
+0x496E	0x24889	
+0x496F	0x24850	
+0x4970	0x24828	
+0x4971	0x249FB	
+0x4972	0x249FC	
+0x4973	0x249FD	
+0x4974	0x249FE	
+0x4975	0x249FF	
+0x4977	0x24A00	
+0x4978	0x24A01	
+0x4979	0x24A02	
+0x497A	0x249E4	
+0x497B	0x249E5	
+0x497C	0x24A03	
+0x497D	0x24A04	
+0x497E	0x24A05	
+0x4A21	0x24A06	
+0x4A22	0x24A07	
+0x4A23	0x24A13	
+0x4A24	0x24A08	
+0x4A25	0x24A09	
+0x4A26	0x249E6	
+0x4A27	0x24A0A	
+0x4A28	0x24A0B	
+0x4A29	0x24A0C	
+0x4A2A	0x24B0B	
+0x4A2B	0x24BF4	
+0x4A2C	0x24C0A	
+0x4A2D	0x24CB1	
+0x4A2E	0x24E1D	
+0x4A2F	0x2F93B	
+0x4A30	0x24F8B	
+0x4A31	0x24F8C	
+0x4A32	0x24F8F	
+0x4A33	0x24F8D	
+0x4A34	0x24F8E	
+0x4A35	0x25006	
+0x4A36	0x25086	
+0x4A37	0x25222	
+0x4A38	0x25223	
+0x4A39	0x25224	
+0x4A3A	0x25225	
+0x4A3B	0x25226	
+0x4A3C	0x25227	
+0x4A3D	0x25228	
+0x4A3E	0x253F1	
+0x4A40	0x25523	
+0x4A41	0x25512	
+0x4A43	0x25513	
+0x4A44	0x25514	
+0x4A45	0x25515	
+0x4A46	0x25516	
+0x4A47	0x25517	
+0x4A48	0x25518	
+0x4A49	0x25519	
+0x4A4A	0x2554B	
+0x4A4B	0x2551A	
+0x4A4C	0x2551B	
+0x4A4D	0x2551C	
+0x4A4F	0x2551D	
+0x4A50	0x2551E	
+0x4A51	0x2551F	
+0x4A52	0x25520	
+0x4A53	0x256CA	
+0x4A54	0x222AC	
+0x4A55	0x256CB	
+0x4A56	0x256CC	
+0x4A57	0x256CD	
+0x4A58	0x256CE	
+0x4A5A	0x256CF	
+0x4A5B	0x25810	
+0x4A5C	0x25811	
+0x4A5D	0x25812	
+0x4A5E	0x25813	
+0x4A5F	0x25814	
+0x4A60	0x2580F	
+0x4A61	0x25815	
+0x4A62	0x25816	
+0x4A63	0x25817	
+0x4A65	0x25818	
+0x4A66	0x259C6	
+0x4A67	0x25A9F	
+0x4A68	0x25AA0	
+0x4A69	0x25AA4	
+0x4A6A	0x25AA1	
+0x4A6B	0x25BB5	
+0x4A6C	0x25BB6	
+0x4A6D	0x25BB7	
+0x4A6E	0x25BB8	
+0x4A6F	0x25BB9	
+0x4A70	0x25BBA	
+0x4A71	0x25BD0	
+0x4A72	0x25BC6	
+0x4A73	0x25BBB	
+0x4A74	0x25BBC	
+0x4A75	0x25BBD	
+0x4A76	0x25BBE	
+0x4A77	0x25BBF	
+0x4A78	0x25BC0	
+0x4A79	0x25BC1	
+0x4A7A	0x25BC2	
+0x4A7B	0x2F960	
+0x4A7C	0x25EA7	
+0x4A7D	0x25EA8	
+0x4A7E	0x25EA9	
+0x4B21	0x25EAA	
+0x4B22	0x25EAB	
+0x4B23	0x25EAC	
+0x4B24	0x25EBC	
+0x4B25	0x25EAD	
+0x4B26	0x25EAE	
+0x4B28	0x25EAF	
+0x4B29	0x25EB0	
+0x4B2A	0x25EB1	
+0x4B2C	0x25EB4	
+0x4B2D	0x25EB2	
+0x4B2E	0x26066	
+0x4B2F	0x26067	
+0x4B30	0x26068	
+0x4B31	0x26069	
+0x4B32	0x2606A	
+0x4B33	0x2606B	
+0x4B34	0x2606C	
+0x4B35	0x2606D	
+0x4B36	0x2606E	
+0x4B37	0x2606F	
+0x4B39	0x2623E	
+0x4B3A	0x2623F	
+0x4B3B	0x26240	
+0x4B3C	0x262E8	
+0x4B3D	0x26452	
+0x4B3E	0x26453	
+0x4B3F	0x26454	
+0x4B40	0x26455	
+0x4B41	0x26591	
+0x4B42	0x26592	
+0x4B43	0x26593	
+0x4B44	0x26594	
+0x4B45	0x26595	
+0x4B46	0x26596	
+0x4B47	0x26597	
+0x4B48	0x26598	
+0x4B4A	0x26599	
+0x4B4B	0x2659A	
+0x4B4C	0x2659B	
+0x4B4D	0x267B7	
+0x4B4E	0x267B8	
+0x4B4F	0x267B9	
+0x4B51	0x267BA	
+0x4B52	0x267BB	
+0x4B53	0x267BD	
+0x4B55	0x267BC	
+0x4B56	0x2F988	
+0x4B57	0x2F987	
+0x4B58	0x268EB	
+0x4B59	0x268EC	
+0x4B5A	0x26916	
+0x4B5B	0x26944	
+0x4B5C	0x269E3	
+0x4B5D	0x26A58	
+0x4B5E	0x26A53	
+0x4B5F	0x26A54	
+0x4B60	0x26AE0	
+0x4B61	0x26DB1	
+0x4B62	0x26DB2	
+0x4B63	0x26DB3	
+0x4B64	0x26DEA	
+0x4B66	0x26DB4	
+0x4B67	0x26DF0	
+0x4B68	0x26DB5	
+0x4B69	0x26DB6	
+0x4B6A	0x26DB7	
+0x4B6B	0x26DB8	
+0x4B6C	0x26DB9	
+0x4B6D	0x26DBA	
+0x4B6E	0x26DBB	
+0x4B6F	0x26DBC	
+0x4B70	0x26DBD	
+0x4B71	0x26DBE	
+0x4B72	0x26DBF	
+0x4B73	0x26DC0	
+0x4B74	0x26DC1	
+0x4B75	0x26DC2	
+0x4B76	0x26DC3	
+0x4B78	0x26DC4	
+0x4B79	0x26DC5	
+0x4B7A	0x26DC6	
+0x4B7B	0x26DFC	
+0x4B7C	0x26DC7	
+0x4B7D	0x26DC8	
+0x4B7E	0x26DC9	
+0x4C21	0x26DCA	
+0x4C22	0x26DCB	
+0x4C23	0x26DCC	
+0x4C24	0x26E84	
+0x4C25	0x26DCD	
+0x4C26	0x26DCE	
+0x4C27	0x26DCF	
+0x4C28	0x26DD0	
+0x4C29	0x26DD1	
+0x4C2A	0x26DD2	
+0x4C2B	0x271CA	
+0x4C2C	0x271CB	
+0x4C2D	0x27336	
+0x4C2E	0x27337	
+0x4C2F	0x2739F	
+0x4C30	0x27338	
+0x4C31	0x27339	
+0x4C32	0x2733A	
+0x4C34	0x276BE	
+0x4C35	0x276F0	
+0x4C36	0x276BF	
+0x4C37	0x276C0	
+0x4C38	0x277F7	
+0x4C39	0x277F8	
+0x4C3A	0x277FA	
+0x4C3B	0x27843	
+0x4C3C	0x27844	
+0x4C3D	0x27A0F	
+0x4C3E	0x27A10	
+0x4C3F	0x27A11	
+0x4C40	0x27A12	
+0x4C42	0x27A13	
+0x4C43	0x27A14	
+0x4C44	0x27A15	
+0x4C45	0x27A16	
+0x4C48	0x27CD3	
+0x4C49	0x27CD7	
+0x4C4B	0x27DB0	
+0x4C4C	0x27D98	
+0x4C4D	0x27D90	
+0x4C4E	0x27D91	
+0x4C4F	0x27D92	
+0x4C50	0x27D97	
+0x4C51	0x27D93	
+0x4C52	0x27E64	
+0x4C53	0x27F01	
+0x4C54	0x27F02	
+0x4C55	0x27F03	
+0x4C56	0x27F04	
+0x4C57	0x27F05	
+0x4C58	0x27F06	
+0x4C59	0x27F07	
+0x4C5A	0x2805A	
+0x4C5B	0x2805B	
+0x4C5C	0x2824E	
+0x4C5D	0x2824F	
+0x4C5E	0x28250	
+0x4C5F	0x28319	
+0x4C60	0x2831A	
+0x4C61	0x2831B	
+0x4C63	0x2831C	
+0x4C65	0x28419	
+0x4C66	0x2841A	
+0x4C68	0x2898A	
+0x4C69	0x2856E	
+0x4C6A	0x2856F	
+0x4C6C	0x28570	
+0x4C6D	0x28571	
+0x4C6E	0x28572	
+0x4C6F	0x28573	
+0x4C70	0x28574	
+0x4C71	0x28575	
+0x4C72	0x28576	
+0x4C73	0x2883A	
+0x4C74	0x2883B	
+0x4C75	0x2883C	
+0x4C76	0x2885A	
+0x4C77	0x2883D	
+0x4C78	0x28842	
+0x4C79	0x2898B	
+0x4C7A	0x289A0	
+0x4C7B	0x2898C	
+0x4C7C	0x2898D	
+0x4C7D	0x2898E	
+0x4C7E	0x289AB	
+0x4D21	0x2898F	
+0x4D23	0x28990	
+0x4D24	0x28991	
+0x4D25	0x28992	
+0x4D26	0x289AA	
+0x4D28	0x28993	
+0x4D29	0x28994	
+0x4D2A	0x2899E	
+0x4D2B	0x289A8	
+0x4D2E	0x28F00	
+0x4D2F	0x28F01	
+0x4D30	0x28F02	
+0x4D31	0x28F03	
+0x4D32	0x28F04	
+0x4D33	0x28F05	
+0x4D34	0x28FC4	
+0x4D35	0x28FC5	
+0x4D37	0x290AE	
+0x4D38	0x290B2	
+0x4D3B	0x291F7	
+0x4D3C	0x29213	
+0x4D3D	0x2939E	
+0x4D3E	0x29485	
+0x4D3F	0x25380	
+0x4D40	0x294C8	
+0x4D41	0x29841	
+0x4D42	0x29881	
+0x4D43	0x29882	
+0x4D44	0x29883	
+0x4D45	0x29884	
+0x4D46	0x29AC4	
+0x4D47	0x29AC5	
+0x4D48	0x29AC6	
+0x4D49	0x29C95	
+0x4D4A	0x29C96	
+0x4D4B	0x29C97	
+0x4D4C	0x29D58	
+0x4D4D	0x29D59	
+0x4D4F	0x29FA9	
+0x4D50	0x29FAA	
+0x4D51	0x29FAB	
+0x4D52	0x2A28E	
+0x4D53	0x2A303	
+0x4D54	0x2A3B3	
+0x4D55	0x20B82	
+0x4D56	0x20053	
+0x4D57	0x20183	
+0x4D58	0x20184	
+0x4D59	0x20185	
+0x4D5A	0x203CC	
+0x4D5B	0x203CD	
+0x4D5C	0x203CE	
+0x4D5D	0x203CF	
+0x4D5E	0x203D0	
+0x4D60	0x203D1	
+0x4D61	0x203D2	
+0x4D62	0x203DA	
+0x4D63	0x204B3	
+0x4D64	0x204B4	
+0x4D66	0x20613	
+0x4D67	0x2060E	
+0x4D68	0x2066B	
+0x4D69	0x20903	
+0x4D6A	0x20961	
+0x4D6B	0x209C1	
+0x4D6C	0x209C2	
+0x4D6D	0x20AB5	
+0x4D6E	0x20140	
+0x4D6F	0x20F98	
+0x4D70	0x20F99	
+0x4D71	0x20F9A	
+0x4D72	0x20F9B	
+0x4D73	0x20F9C	
+0x4D74	0x20F9D	
+0x4D75	0x20F9E	
+0x4D76	0x20F9F	
+0x4D77	0x20FEE	
+0x4D78	0x20FA0	
+0x4D79	0x20FA1	
+0x4D7A	0x20F86	
+0x4D7B	0x21225	
+0x4D7C	0x21434	
+0x4D7D	0x21435	
+0x4D7E	0x21451	
+0x4E21	0x2142D	
+0x4E22	0x24362	
+0x4E23	0x21454	
+0x4E24	0x21452	
+0x4E26	0x21436	
+0x4E27	0x21437	
+0x4E28	0x21438	
+0x4E29	0x21439	
+0x4E2A	0x2143A	
+0x4E2B	0x2143B	
+0x4E2C	0x21468	
+0x4E2D	0x2143C	
+0x4E2F	0x21577	
+0x4E30	0x23296	
+0x4E31	0x2167E	
+0x4E32	0x2167F	
+0x4E33	0x21869	
+0x4E34	0x2186A	
+0x4E35	0x2186B	
+0x4E36	0x2186C	
+0x4E37	0x2186D	
+0x4E38	0x2186E	
+0x4E39	0x2186F	
+0x4E3A	0x2185D	
+0x4E3B	0x21870	
+0x4E3C	0x21885	
+0x4E3D	0x21871	
+0x4E3E	0x21872	
+0x4E3F	0x21873	
+0x4E40	0x21874	
+0x4E41	0x21875	
+0x4E42	0x21876	
+0x4E43	0x21884	
+0x4E44	0x21877	
+0x4E45	0x21883	
+0x4E46	0x2199A	
+0x4E47	0x21AA7	
+0x4E48	0x21AA8	
+0x4E49	0x21AA9	
+0x4E4A	0x21AAA	
+0x4E4B	0x21AAB	
+0x4E4C	0x21AAC	
+0x4E4D	0x21AB7	
+0x4E4E	0x21AAD	
+0x4E4F	0x21AAE	
+0x4E51	0x21B45	
+0x4E52	0x21CD3	
+0x4E53	0x21CD4	
+0x4E54	0x21CD5	
+0x4E55	0x21CD6	
+0x4E56	0x21CD7	
+0x4E57	0x21F26	
+0x4E58	0x21F27	
+0x4E59	0x21F28	
+0x4E5B	0x21F29	
+0x4E5C	0x21F2A	
+0x4E5D	0x22005	
+0x4E5F	0x221D0	
+0x4E60	0x222B7	
+0x4E62	0x222B8	
+0x4E63	0x222B9	
+0x4E64	0x22422	
+0x4E65	0x22423	
+0x4E66	0x22573	
+0x4E67	0x22574	
+0x4E68	0x2288F	
+0x4E69	0x22812	
+0x4E6A	0x22813	
+0x4E6B	0x22814	
+0x4E6C	0x22815	
+0x4E6D	0x22816	
+0x4E6E	0x22817	
+0x4E6F	0x22818	
+0x4E70	0x22861	
+0x4E71	0x22866	
+0x4E72	0x22867	
+0x4E73	0x22819	
+0x4E74	0x22868	
+0x4E75	0x2281A	
+0x4E76	0x22869	
+0x4E77	0x22A04	
+0x4E78	0x22A05	
+0x4E7A	0x22A06	
+0x4E7B	0x229FD	
+0x4E7C	0x22D50	
+0x4E7D	0x22D51	
+0x4E7E	0x22D52	
+0x4F21	0x22D53	
+0x4F22	0x22D54	
+0x4F23	0x22D55	
+0x4F24	0x22D63	
+0x4F25	0x2F8C4	
+0x4F26	0x22D56	
+0x4F27	0x22D57	
+0x4F28	0x22D58	
+0x4F29	0x22D59	
+0x4F2A	0x22D5A	
+0x4F2B	0x22D5B	
+0x4F2D	0x22D5C	
+0x4F2E	0x22D5D	
+0x4F2F	0x22D5E	
+0x4F30	0x22D5F	
+0x4F31	0x22FD7	
+0x4F33	0x23060	
+0x4F34	0x23061	
+0x4F35	0x23117	
+0x4F36	0x23139	
+0x4F37	0x2328F	
+0x4F38	0x232C8	
+0x4F39	0x23290	
+0x4F3A	0x23291	
+0x4F3B	0x23398	
+0x4F3C	0x23399	
+0x4F3D	0x23644	
+0x4F3E	0x23645	
+0x4F3F	0x23646	
+0x4F40	0x23659	
+0x4F41	0x236EE	
+0x4F43	0x23647	
+0x4F44	0x23648	
+0x4F46	0x23649	
+0x4F47	0x2364A	
+0x4F48	0x2364B	
+0x4F49	0x2364C	
+0x4F4A	0x2364D	
+0x4F4B	0x2364E	
+0x4F4C	0x2364F	
+0x4F4D	0x23650	
+0x4F4E	0x23651	
+0x4F4F	0x23652	
+0x4F50	0x23653	
+0x4F51	0x23654	
+0x4F52	0x23655	
+0x4F53	0x23656	
+0x4F54	0x23915	
+0x4F55	0x2399A	
+0x4F56	0x23A58	
+0x4F57	0x23AFC	
+0x4F58	0x23AFD	
+0x4F59	0x23F86	
+0x4F5A	0x23F87	
+0x4F5B	0x23F88	
+0x4F5C	0x23F89	
+0x4F5D	0x23F8A	
+0x4F5E	0x23F8B	
+0x4F5F	0x23F8C	
+0x4F61	0x2401F	
+0x4F62	0x23F8D	
+0x4F63	0x23F8E	
+0x4F64	0x23F8F	
+0x4F65	0x23F90	
+0x4F66	0x23F91	
+0x4F67	0x23F92	
+0x4F68	0x23F93	
+0x4F69	0x2F911	
+0x4F6A	0x23F94	
+0x4F6B	0x23F95	
+0x4F6C	0x23ECA	
+0x4F6D	0x23F18	
+0x4F6F	0x23F96	
+0x4F70	0x23F97	
+0x4F71	0x23F98	
+0x4F72	0x23F99	
+0x4F73	0x23F9A	
+0x4F74	0x23F9B	
+0x4F75	0x23F9C	
+0x4F76	0x23F9D	
+0x4F77	0x23F9E	
+0x4F78	0x23F9F	
+0x4F7B	0x23FA0	
+0x4F7C	0x23FA1	
+0x4F7E	0x23FB7	
+0x5022	0x24396	
+0x5023	0x24368	
+0x5024	0x24369	
+0x5025	0x2438C	
+0x5026	0x2436A	
+0x5027	0x2436B	
+0x5028	0x2436C	
+0x5029	0x2436D	
+0x502A	0x2436E	
+0x502B	0x2436F	
+0x502C	0x2437F	
+0x502D	0x24384	
+0x502E	0x24370	
+0x502F	0x24371	
+0x5030	0x24385	
+0x5031	0x24372	
+0x5032	0x24373	
+0x5033	0x24374	
+0x5034	0x24375	
+0x5035	0x24376	
+0x5037	0x24377	
+0x5038	0x24378	
+0x5039	0x24379	
+0x503A	0x2437A	
+0x503B	0x2437B	
+0x503C	0x2437C	
+0x503D	0x2F91E	
+0x503E	0x24594	
+0x503F	0x246D5	
+0x5040	0x24829	
+0x5041	0x24A2B	
+0x5042	0x24A2C	
+0x5043	0x24A2D	
+0x5044	0x24A2E	
+0x5045	0x24A2F	
+0x5046	0x24A30	
+0x5047	0x24A3E	
+0x5048	0x24A31	
+0x5049	0x24A32	
+0x504A	0x24A33	
+0x504B	0x24A34	
+0x504C	0x24A35	
+0x504D	0x24B11	
+0x504F	0x24CC0	
+0x5050	0x24E42	
+0x5051	0x24E43	
+0x5052	0x24E44	
+0x5053	0x24E45	
+0x5054	0x24E46	
+0x5055	0x2508C	
+0x5056	0x2508D	
+0x5057	0x2508E	
+0x5058	0x2508F	
+0x5059	0x25090	
+0x505A	0x25091	
+0x505B	0x25263	
+0x505C	0x25264	
+0x505D	0x25265	
+0x505F	0x2F94A	
+0x5061	0x253F6	
+0x5062	0x25536	
+0x5063	0x25537	
+0x5064	0x2552C	
+0x5065	0x25538	
+0x5066	0x25539	
+0x5068	0x2553A	
+0x5069	0x256E3	
+0x506A	0x256E2	
+0x506B	0x256F5	
+0x506C	0x25847	
+0x506E	0x25848	
+0x506F	0x25849	
+0x5070	0x2584A	
+0x5071	0x2584B	
+0x5072	0x2584C	
+0x5073	0x25AA8	
+0x5074	0x25AA9	
+0x5075	0x25AAA	
+0x5077	0x25C0B	
+0x5078	0x25C06	
+0x5079	0x25C73	
+0x507A	0x25C0C	
+0x507B	0x25C0D	
+0x507C	0x25C0E	
+0x507D	0x25C0F	
+0x507E	0x25C10	
+0x5122	0x25C11	
+0x5123	0x2F962	
+0x5124	0x25C12	
+0x5125	0x25C14	
+0x5126	0x25C15	
+0x5127	0x25C16	
+0x5129	0x25C13	
+0x512A	0x25C17	
+0x512B	0x25ED9	
+0x512C	0x25EDA	
+0x512D	0x25EDB	
+0x512F	0x25EDC	
+0x5130	0x260A6	
+0x5131	0x260A7	
+0x5132	0x260A8	
+0x5133	0x260A9	
+0x5134	0x260AA	
+0x5135	0x260AB	
+0x5137	0x2F96D	
+0x5138	0x260AC	
+0x5139	0x260AD	
+0x513A	0x260AE	
+0x513D	0x260AF	
+0x513E	0x260B0	
+0x513F	0x260B1	
+0x5140	0x26244	
+0x5141	0x26245	
+0x5142	0x262F7	
+0x5143	0x262F8	
+0x5144	0x2646B	
+0x5145	0x2646C	
+0x5146	0x26461	
+0x5147	0x26512	
+0x5148	0x265AF	
+0x5149	0x265B0	
+0x514A	0x265B1	
+0x514B	0x265B2	
+0x514C	0x265B3	
+0x514D	0x265B4	
+0x514E	0x265B5	
+0x514F	0x265B6	
+0x5150	0x26622	
+0x5151	0x267EA	
+0x5152	0x267EB	
+0x5153	0x267EC	
+0x5154	0x267ED	
+0x5156	0x268ED	
+0x5157	0x2691B	
+0x5158	0x26947	
+0x5159	0x269E8	
+0x515A	0x26AD0	
+0x515B	0x26AE7	
+0x515C	0x26AE8	
+0x515D	0x26AE9	
+0x515E	0x26E4E	
+0x515F	0x26E4F	
+0x5160	0x26E50	
+0x5161	0x26E72	
+0x5162	0x26E51	
+0x5163	0x26E52	
+0x5164	0x2F9A7	
+0x5166	0x26E53	
+0x5167	0x26E54	
+0x5168	0x26E55	
+0x5169	0x26E56	
+0x516A	0x26E57	
+0x516B	0x26E77	
+0x516C	0x26E58	
+0x516D	0x26E59	
+0x516E	0x26E5A	
+0x516F	0x26E5B	
+0x5170	0x26E5C	
+0x5171	0x26E6E	
+0x5172	0x26E5D	
+0x5175	0x26E5E	
+0x5177	0x26E5F	
+0x5179	0x271D7	
+0x517A	0x27389	
+0x517B	0x2738A	
+0x517D	0x2F9BE	
+0x517E	0x2738B	
+0x5221	0x2738C	
+0x5222	0x2738D	
+0x5223	0x2738E	
+0x5224	0x2F9BC	
+0x5225	0x2738F	
+0x5227	0x2739A	
+0x5228	0x27390	
+0x5229	0x27391	
+0x522A	0x27392	
+0x522B	0x27393	
+0x522C	0x27712	
+0x522D	0x276F1	
+0x522F	0x277FE	
+0x5230	0x277FB	
+0x5231	0x27857	
+0x5232	0x27A49	
+0x5233	0x27A4A	
+0x5234	0x27A4B	
+0x5235	0x27A4C	
+0x5237	0x27A4D	
+0x5238	0x27A59	
+0x5239	0x27A4E	
+0x523A	0x27A4F	
+0x523B	0x27BF4	
+0x523C	0x27C65	
+0x523D	0x27DA6	
+0x523E	0x27DA7	
+0x523F	0x27DA8	
+0x5240	0x27F22	
+0x5241	0x27F23	
+0x5242	0x2808B	
+0x5243	0x2808C	
+0x5244	0x2808D	
+0x5245	0x2808E	
+0x5246	0x28258	
+0x5248	0x28259	
+0x5249	0x2833B	
+0x524A	0x2833C	
+0x524B	0x2833D	
+0x524C	0x2833E	
+0x524D	0x28448	
+0x524E	0x28594	
+0x524F	0x28595	
+0x5250	0x28596	
+0x5251	0x28597	
+0x5252	0x28598	
+0x5253	0x2877D	
+0x5254	0x286FE	
+0x5255	0x2877E	
+0x5256	0x2877F	
+0x5258	0x2885B	
+0x5259	0x2885C	
+0x525A	0x289E4	
+0x525B	0x289C1	
+0x525C	0x289FD	
+0x525D	0x289C2	
+0x525E	0x289D6	
+0x525F	0x289C3	
+0x5260	0x289C4	
+0x5262	0x289DC	
+0x5263	0x289C5	
+0x5264	0x289C6	
+0x5265	0x289C7	
+0x5266	0x289E1	
+0x5267	0x289C8	
+0x5268	0x289C9	
+0x5269	0x289CA	
+0x526A	0x289CB	
+0x526C	0x289CC	
+0x526D	0x289CD	
+0x526E	0x28D35	
+0x526F	0x28D36	
+0x5270	0x28D47	
+0x5271	0x28D37	
+0x5272	0x28F1B	
+0x5273	0x28F1C	
+0x5274	0x28F1D	
+0x5275	0x28F1E	
+0x5276	0x28F1F	
+0x5277	0x28F20	
+0x5278	0x28F7B	
+0x5279	0x28F7A	
+0x527A	0x28FFE	
+0x527B	0x290C6	
+0x527C	0x290C7	
+0x527D	0x290C8	
+0x527E	0x290C9	
+0x5321	0x290CA	
+0x5323	0x294A0	
+0x5324	0x294A1	
+0x5325	0x295CC	
+0x5326	0x295CD	
+0x5327	0x296F1	
+0x5328	0x296D7	
+0x5329	0x29842	
+0x532A	0x29846	
+0x532B	0x298A3	
+0x532C	0x298A5	
+0x532D	0x298A6	
+0x532E	0x29ACB	
+0x532F	0x29ACC	
+0x5330	0x29B26	
+0x5331	0x29B27	
+0x5332	0x29B28	
+0x5333	0x29B29	
+0x5334	0x29CAE	
+0x5335	0x29CAF	
+0x5336	0x29CB0	
+0x5337	0x29D73	
+0x5339	0x29D7C	
+0x533A	0x29D74	
+0x533C	0x29F80	
+0x533D	0x29D75	
+0x5340	0x29FCF	
+0x5342	0x2A38F	
+0x5343	0x20670	
+0x5344	0x20085	
+0x5345	0x20397	
+0x5346	0x203F6	
+0x5347	0x203F7	
+0x5348	0x203F8	
+0x5349	0x203FA	
+0x534A	0x203FB	
+0x534B	0x204BA	
+0x534C	0x204BB	
+0x534D	0x204BC	
+0x534E	0x204BD	
+0x534F	0x20534	
+0x5350	0x20535	
+0x5351	0x205A2	
+0x5352	0x20614	
+0x5353	0x20611	
+0x5354	0x2066E	
+0x5355	0x2066F	
+0x5356	0x20808	
+0x5357	0x208B8	
+0x5358	0x20A09	
+0x5359	0x20ABD	
+0x535A	0x20ABE	
+0x535B	0x20B88	
+0x535C	0x20FFE	
+0x535E	0x20FFF	
+0x535F	0x21000	
+0x5360	0x21001	
+0x5361	0x21002	
+0x5362	0x21003	
+0x5363	0x21004	
+0x5364	0x21005	
+0x5365	0x21006	
+0x5367	0x21007	
+0x5368	0x21008	
+0x5369	0x21009	
+0x536A	0x2100A	
+0x536B	0x2100B	
+0x536C	0x2100C	
+0x536D	0x2100D	
+0x536E	0x2100E	
+0x536F	0x2100F	
+0x5373	0x2122C	
+0x5374	0x2146B	
+0x5376	0x2146C	
+0x5377	0x21487	
+0x5378	0x2146D	
+0x5379	0x21578	
+0x537A	0x2168B	
+0x537B	0x218A4	
+0x537C	0x218A5	
+0x537D	0x218A6	
+0x537E	0x218A7	
+0x5421	0x218BE	
+0x5422	0x218A8	
+0x5423	0x218A9	
+0x5424	0x218AA	
+0x5425	0x2188D	
+0x5426	0x218AB	
+0x5427	0x218AC	
+0x5428	0x218BF	
+0x542B	0x218AD	
+0x542C	0x218AE	
+0x542D	0x219A4	
+0x542E	0x219A5	
+0x542F	0x21AC7	
+0x5430	0x21AC8	
+0x5431	0x21AC9	
+0x5432	0x27DBC	
+0x5433	0x21ACA	
+0x5434	0x21ACB	
+0x5435	0x21ACC	
+0x5436	0x21ACD	
+0x5437	0x21ACE	
+0x5438	0x21C19	
+0x5439	0x21CE6	
+0x543A	0x21F4C	
+0x543B	0x21F4D	
+0x543C	0x21F4E	
+0x543D	0x22006	
+0x543F	0x222CD	
+0x5440	0x222CE	
+0x5441	0x222CF	
+0x5442	0x222D0	
+0x5444	0x22581	
+0x5445	0x22582	
+0x5446	0x20533	
+0x5447	0x2286A	
+0x5448	0x2286B	
+0x5449	0x228B2	
+0x544A	0x2286C	
+0x544B	0x2286D	
+0x544C	0x228CC	
+0x544D	0x228AE	
+0x544E	0x228B3	
+0x544F	0x22891	
+0x5451	0x2286E	
+0x5452	0x228B4	
+0x5453	0x2286F	
+0x5454	0x22DC9	
+0x5455	0x22DA7	
+0x5456	0x22DA8	
+0x5457	0x22DA9	
+0x5458	0x22DAA	
+0x5459	0x22DAB	
+0x545A	0x22DAC	
+0x545B	0x22DAD	
+0x545C	0x22DAE	
+0x545D	0x22DAF	
+0x545E	0x22DB0	
+0x545F	0x22D60	
+0x5460	0x22DB1	
+0x5461	0x22EE1	
+0x5462	0x22FE3	
+0x5463	0x22FF6	
+0x5465	0x232AF	
+0x5466	0x232B0	
+0x5467	0x232B1	
+0x5468	0x232BA	
+0x5469	0x232B2	
+0x546A	0x232B3	
+0x546B	0x2334C	
+0x546D	0x233A0	
+0x546E	0x233A1	
+0x546F	0x236B0	
+0x5470	0x236B1	
+0x5471	0x236B2	
+0x5472	0x236B3	
+0x5473	0x236B4	
+0x5474	0x2F8EB	
+0x5475	0x236B5	
+0x5476	0x236B6	
+0x5477	0x236B7	
+0x5478	0x236B8	
+0x5479	0x236B9	
+0x547A	0x236BA	
+0x547C	0x236BB	
+0x547D	0x236BC	
+0x547E	0x236BD	
+0x5521	0x236BE	
+0x5522	0x236BF	
+0x5523	0x236DF	
+0x5524	0x236C0	
+0x5525	0x236C1	
+0x5526	0x236C2	
+0x5527	0x236C3	
+0x5528	0x236C4	
+0x552B	0x236C5	
+0x552C	0x236C6	
+0x552D	0x236C7	
+0x552E	0x236C8	
+0x552F	0x236C9	
+0x5530	0x236CA	
+0x5531	0x2373C	
+0x5532	0x236CB	
+0x5533	0x236CC	
+0x5534	0x236CD	
+0x5535	0x236CE	
+0x5536	0x236CF	
+0x5537	0x236D0	
+0x5538	0x236D1	
+0x553A	0x2391D	
+0x553B	0x2391E	
+0x553C	0x23A64	
+0x553D	0x23A65	
+0x553E	0x23AC5	
+0x553F	0x23AC6	
+0x5540	0x23AC7	
+0x5541	0x23AFF	
+0x5542	0x23BFF	
+0x5543	0x23C00	
+0x5544	0x23C01	
+0x5545	0x23C02	
+0x5546	0x23FF5	
+0x5547	0x2405C	
+0x5548	0x23FF6	
+0x5549	0x23FF7	
+0x554A	0x23FB0	
+0x554B	0x23FF8	
+0x554C	0x23FF9	
+0x554D	0x2405D	
+0x554E	0x24050	
+0x554F	0x23FFA	
+0x5550	0x23FFB	
+0x5551	0x23FA2	
+0x5552	0x23FFC	
+0x5553	0x23FFD	
+0x5554	0x23FFE	
+0x5555	0x23FFF	
+0x5556	0x2F913	
+0x5557	0x24000	
+0x5558	0x2F91F	
+0x5559	0x243C1	
+0x555A	0x243C2	
+0x555B	0x243C3	
+0x555C	0x243C4	
+0x555D	0x243C5	
+0x555E	0x243C6	
+0x555F	0x243C7	
+0x5560	0x243C8	
+0x5561	0x243C9	
+0x5562	0x243CA	
+0x5563	0x243CB	
+0x5564	0x290EF	
+0x5565	0x243D7	
+0x5566	0x243CC	
+0x5567	0x243CD	
+0x5568	0x243CE	
+0x5569	0x24422	
+0x556A	0x243CF	
+0x556B	0x243D0	
+0x556D	0x243D1	
+0x556E	0x243D2	
+0x556F	0x243E9	
+0x5570	0x243D3	
+0x5571	0x243D4	
+0x5572	0x243D5	
+0x5573	0x24538	
+0x5574	0x2103B	
+0x5575	0x2487D	
+0x5576	0x2056F	
+0x5577	0x248A1	
+0x5578	0x24A53	
+0x5579	0x24A54	
+0x557B	0x24A55	
+0x557C	0x24A3C	
+0x557D	0x24A56	
+0x5621	0x24A66	
+0x5623	0x24A57	
+0x5624	0x24A58	
+0x5625	0x24A59	
+0x5626	0x24A5A	
+0x5627	0x24A5B	
+0x5628	0x24A67	
+0x5629	0x24A5C	
+0x562C	0x24A6A	
+0x562D	0x24A5D	
+0x562E	0x24A3D	
+0x562F	0x24A5E	
+0x5630	0x24A65	
+0x5631	0x24CE1	
+0x5632	0x24CCD	
+0x5633	0x2A011	
+0x5634	0x24E6F	
+0x5635	0x24E70	
+0x5636	0x2501A	
+0x5637	0x2509A	
+0x5638	0x2509B	
+0x5639	0x2509C	
+0x563A	0x2509E	
+0x563B	0x2509F	
+0x563C	0x2F93F	
+0x563D	0x2528E	
+0x563F	0x253FD	
+0x5641	0x2555E	
+0x5642	0x2555F	
+0x5643	0x25560	
+0x5644	0x25565	
+0x5645	0x25567	
+0x5646	0x25568	
+0x5647	0x25569	
+0x5649	0x2556A	
+0x564A	0x2558F	
+0x564B	0x2556B	
+0x564C	0x2556C	
+0x564D	0x2556D	
+0x564E	0x256F7	
+0x564F	0x256F8	
+0x5650	0x256F9	
+0x5651	0x256E4	
+0x5652	0x256FA	
+0x5653	0x258B1	
+0x5654	0x25875	
+0x5655	0x25876	
+0x5656	0x259FF	
+0x5657	0x25A00	
+0x5658	0x25A01	
+0x5659	0x25A02	
+0x565A	0x25A03	
+0x565B	0x25AAE	
+0x565C	0x25AAD	
+0x565D	0x25C51	
+0x565E	0x25C52	
+0x5660	0x25C53	
+0x5661	0x25C54	
+0x5662	0x25C55	
+0x5663	0x25C56	
+0x5664	0x25C57	
+0x5665	0x25C58	
+0x5666	0x25C59	
+0x5667	0x25C5A	
+0x5668	0x25C5B	
+0x5669	0x25C5C	
+0x566A	0x25C5D	
+0x566B	0x25C5E	
+0x566C	0x25C5F	
+0x566D	0x25C60	
+0x566E	0x25C61	
+0x566F	0x25C62	
+0x5670	0x25C63	
+0x5671	0x25C64	
+0x5672	0x25C4C	
+0x5673	0x25C66	
+0x5674	0x25EF1	
+0x5675	0x25EF2	
+0x5676	0x260F2	
+0x5677	0x260F3	
+0x5678	0x260F4	
+0x5679	0x260F5	
+0x567A	0x260F6	
+0x567B	0x260F7	
+0x567C	0x260F8	
+0x567D	0x260F9	
+0x567E	0x260FA	
+0x5721	0x2624C	
+0x5722	0x2624B	
+0x5723	0x2631B	
+0x5724	0x263CE	
+0x5725	0x263B3	
+0x5726	0x2647F	
+0x5727	0x2F979	
+0x5728	0x2F97C	
+0x5729	0x2651A	
+0x572A	0x265C4	
+0x572B	0x265C5	
+0x572C	0x265C6	
+0x572D	0x265C7	
+0x572E	0x265C8	
+0x572F	0x265C9	
+0x5731	0x26819	
+0x5732	0x2681C	
+0x5733	0x2681A	
+0x5734	0x2694C	
+0x5735	0x2698E	
+0x5736	0x26A7E	
+0x5737	0x26EEB	
+0x5738	0x26EEC	
+0x5739	0x26EED	
+0x573A	0x26EEE	
+0x573B	0x26EEF	
+0x573C	0x26EF0	
+0x573D	0x26EF1	
+0x573E	0x26ED8	
+0x573F	0x26ED9	
+0x5740	0x26EDA	
+0x5741	0x26EDB	
+0x5742	0x26EF2	
+0x5743	0x26EF3	
+0x5744	0x26EF4	
+0x5745	0x26F07	
+0x5747	0x2F9AC	
+0x5749	0x26EF5	
+0x574A	0x26F15	
+0x574C	0x26EF6	
+0x574D	0x26EF7	
+0x574E	0x26EF8	
+0x574F	0x26EF9	
+0x5750	0x26EFA	
+0x5751	0x26EFB	
+0x5752	0x26EFC	
+0x5753	0x26EFD	
+0x5754	0x26EFE	
+0x5755	0x26FA7	
+0x5756	0x26EFF	
+0x5757	0x26F00	
+0x5758	0x26F01	
+0x5759	0x26F02	
+0x575A	0x26F03	
+0x575B	0x26F04	
+0x575C	0x26F05	
+0x575D	0x271E9	
+0x575E	0x271EA	
+0x575F	0x271EB	
+0x5760	0x273DE	
+0x5761	0x273DF	
+0x5763	0x273E0	
+0x5764	0x273E1	
+0x5765	0x273E2	
+0x5766	0x273E3	
+0x5767	0x2773E	
+0x5768	0x2773F	
+0x5769	0x27740	
+0x576A	0x27741	
+0x576B	0x27871	
+0x576C	0x27872	
+0x576D	0x27873	
+0x576E	0x27A88	
+0x576F	0x27A89	
+0x5770	0x27A8A	
+0x5771	0x27A8B	
+0x5772	0x27A8C	
+0x5773	0x27A8D	
+0x5774	0x27A8E	
+0x5775	0x27A8F	
+0x5776	0x27A90	
+0x5777	0x27A91	
+0x5778	0x27A92	
+0x577A	0x27CF1	
+0x577B	0x27DBE	
+0x577C	0x27DBF	
+0x577D	0x27DC0	
+0x577E	0x27DC1	
+0x5821	0x27DC2	
+0x5822	0x27DC3	
+0x5823	0x27E6E	
+0x5824	0x27F37	
+0x5825	0x27F57	
+0x5826	0x27F38	
+0x5827	0x27F39	
+0x5828	0x27F3A	
+0x5829	0x27F3B	
+0x582A	0x27F3C	
+0x582B	0x27F3D	
+0x582C	0x27F3E	
+0x582D	0x27F27	
+0x582E	0x27F3F	
+0x5831	0x280C0	
+0x5832	0x280C1	
+0x5834	0x28267	
+0x5836	0x28268	
+0x5837	0x28358	
+0x5838	0x28365	
+0x5839	0x28359	
+0x583A	0x2835A	
+0x583B	0x28424	
+0x583C	0x285CD	
+0x583D	0x285CE	
+0x583E	0x285CF	
+0x583F	0x285D2	
+0x5840	0x2879F	
+0x5841	0x28722	
+0x5842	0x2887D	
+0x5843	0x2887E	
+0x5844	0x289FF	
+0x5845	0x28A25	
+0x5846	0x28A00	
+0x5847	0x28A01	
+0x5849	0x28A02	
+0x584A	0x28A03	
+0x584B	0x28A04	
+0x584D	0x28A05	
+0x584E	0x28A06	
+0x584F	0x28A07	
+0x5850	0x28A16	
+0x5851	0x28A08	
+0x5852	0x28A17	
+0x5853	0x28A09	
+0x5854	0x28A0A	
+0x5856	0x28A0B	
+0x5857	0x28A0C	
+0x5858	0x28A29	
+0x585A	0x28A0D	
+0x585C	0x28A0E	
+0x585D	0x28A10	
+0x585E	0x28A11	
+0x585F	0x28A1D	
+0x5860	0x28A12	
+0x5861	0x28A13	
+0x5863	0x28A14	
+0x5864	0x28A15	
+0x5865	0x28C8D	
+0x5866	0x28D54	
+0x5867	0x28D55	
+0x5868	0x28D56	
+0x5869	0x28F33	
+0x586A	0x28F34	
+0x586B	0x28F35	
+0x586C	0x28F36	
+0x586D	0x28FFA	
+0x586E	0x290E3	
+0x586F	0x290E6	
+0x5870	0x290ED	
+0x5871	0x290E7	
+0x5872	0x290E8	
+0x5873	0x290E9	
+0x5874	0x290EA	
+0x5875	0x290EB	
+0x5876	0x29227	
+0x5877	0x29220	
+0x5878	0x2F9F8	
+0x5879	0x2942A	
+0x587A	0x294C9	
+0x587C	0x294CA	
+0x587D	0x294CB	
+0x587E	0x294D9	
+0x5921	0x294CC	
+0x5922	0x294CD	
+0x5923	0x294CE	
+0x5925	0x295E1	
+0x5926	0x2971B	
+0x5927	0x2971C	
+0x5928	0x2971D	
+0x5929	0x2971E	
+0x592A	0x29847	
+0x592B	0x298D1	
+0x592C	0x298C9	
+0x592D	0x29AD0	
+0x592E	0x29AD1	
+0x592F	0x29B3F	
+0x5930	0x29B40	
+0x5931	0x29B41	
+0x5932	0x2FA09	
+0x5933	0x29B42	
+0x5934	0x29CC4	
+0x5935	0x29D9B	
+0x5936	0x29D92	
+0x5937	0x29D93	
+0x5939	0x29D94	
+0x593A	0x29D95	
+0x593D	0x29FF3	
+0x593E	0x29FF4	
+0x593F	0x29FF5	
+0x5940	0x29FF6	
+0x5941	0x2A260	
+0x5942	0x2A29E	
+0x5943	0x2A2A0	
+0x5944	0x2A2A1	
+0x5945	0x2A31C	
+0x5946	0x2A39F	
+0x5947	0x20056	
+0x5948	0x20412	
+0x5949	0x2041F	
+0x594A	0x20415	
+0x594B	0x20416	
+0x594C	0x20417	
+0x594D	0x2F80C	
+0x594E	0x20418	
+0x594F	0x204C2	
+0x5950	0x204C3	
+0x5951	0x204C4	
+0x5952	0x205A1	
+0x5953	0x2061B	
+0x5954	0x2061C	
+0x5955	0x20671	
+0x5956	0x20813	
+0x5957	0x20B17	
+0x5958	0x20B8F	
+0x5959	0x2105F	
+0x595A	0x21060	
+0x595B	0x210AC	
+0x595E	0x21061	
+0x595F	0x21062	
+0x5960	0x21063	
+0x5961	0x21064	
+0x5962	0x21065	
+0x5964	0x21499	
+0x5965	0x2149A	
+0x5966	0x2149B	
+0x5967	0x2149C	
+0x5968	0x2149D	
+0x5969	0x2149E	
+0x596A	0x2149F	
+0x596B	0x214A0	
+0x596C	0x218DA	
+0x596D	0x218DB	
+0x596E	0x218DC	
+0x596F	0x218DD	
+0x5970	0x218DE	
+0x5971	0x218DF	
+0x5972	0x21AD5	
+0x5973	0x21AD6	
+0x5974	0x21AD7	
+0x5975	0x21AD8	
+0x5976	0x21AE0	
+0x5977	0x21BB4	
+0x5979	0x21F6E	
+0x597A	0x21F6F	
+0x597B	0x21F70	
+0x597C	0x22163	
+0x597E	0x222D5	
+0x5A21	0x222D6	
+0x5A22	0x222D7	
+0x5A23	0x222D8	
+0x5A24	0x22430	
+0x5A25	0x228B5	
+0x5A26	0x228B6	
+0x5A27	0x228C1	
+0x5A28	0x228F7	
+0x5A2A	0x228CB	
+0x5A2B	0x228E8	
+0x5A2D	0x228E9	
+0x5A2E	0x228B7	
+0x5A2F	0x22A15	
+0x5A30	0x22DE6	
+0x5A31	0x22DE7	
+0x5A32	0x22DE8	
+0x5A33	0x22DE9	
+0x5A34	0x22DEA	
+0x5A35	0x22DEB	
+0x5A36	0x2F8CA	
+0x5A37	0x2300B	
+0x5A38	0x2300C	
+0x5A39	0x23064	
+0x5A3A	0x232D4	
+0x5A3B	0x232D5	
+0x5A3C	0x232D6	
+0x5A3D	0x232D8	
+0x5A3E	0x233A5	
+0x5A3F	0x2005B	
+0x5A40	0x2370F	
+0x5A41	0x23710	
+0x5A43	0x23711	
+0x5A44	0x23712	
+0x5A45	0x23713	
+0x5A46	0x23714	
+0x5A47	0x23715	
+0x5A48	0x23716	
+0x5A49	0x23717	
+0x5A4A	0x23718	
+0x5A4B	0x23719	
+0x5A4C	0x2371A	
+0x5A4D	0x2372F	
+0x5A4E	0x2371B	
+0x5A4F	0x2371C	
+0x5A50	0x2373F	
+0x5A51	0x2371D	
+0x5A52	0x2371E	
+0x5A53	0x2372C	
+0x5A54	0x2371F	
+0x5A55	0x23924	
+0x5A56	0x239A4	
+0x5A57	0x239A5	
+0x5A58	0x26251	
+0x5A59	0x23AFE	
+0x5A5A	0x23C11	
+0x5A5B	0x23C12	
+0x5A5C	0x23C13	
+0x5A5D	0x23C54	
+0x5A5E	0x2405E	
+0x5A5F	0x24021	
+0x5A60	0x2403F	
+0x5A61	0x24040	
+0x5A62	0x24041	
+0x5A63	0x24042	
+0x5A64	0x24043	
+0x5A65	0x24044	
+0x5A66	0x24020	
+0x5A67	0x24045	
+0x5A69	0x24046	
+0x5A6A	0x240B0	
+0x5A6B	0x24047	
+0x5A6C	0x24057	
+0x5A6D	0x24001	
+0x5A6E	0x240B1	
+0x5A6F	0x2405A	
+0x5A70	0x24048	
+0x5A71	0x24404	
+0x5A72	0x24405	
+0x5A74	0x2444F	
+0x5A75	0x24450	
+0x5A76	0x24406	
+0x5A77	0x24407	
+0x5A78	0x24408	
+0x5A79	0x24409	
+0x5A7A	0x2440A	
+0x5A7B	0x2440B	
+0x5A7C	0x2440C	
+0x5A7D	0x2440D	
+0x5A7E	0x2440E	
+0x5B21	0x2440F	
+0x5B22	0x24410	
+0x5B23	0x24411	
+0x5B24	0x24533	
+0x5B25	0x24534	
+0x5B26	0x24535	
+0x5B27	0x245FC	
+0x5B28	0x245FD	
+0x5B29	0x248B0	
+0x5B2A	0x248B1	
+0x5B2B	0x248B2	
+0x5B2C	0x248B3	
+0x5B2E	0x24A7B	
+0x5B2F	0x24A7C	
+0x5B30	0x24A7D	
+0x5B31	0x24A7E	
+0x5B32	0x24A7F	
+0x5B33	0x24A80	
+0x5B34	0x24A81	
+0x5B35	0x24A82	
+0x5B36	0x24BF9	
+0x5B37	0x24CDA	
+0x5B38	0x24EA1	
+0x5B3B	0x250AD	
+0x5B3C	0x250AE	
+0x5B3E	0x252C8	
+0x5B3F	0x252C9	
+0x5B40	0x252CA	
+0x5B41	0x25582	
+0x5B42	0x25583	
+0x5B43	0x25584	
+0x5B44	0x25585	
+0x5B45	0x25586	
+0x5B46	0x25587	
+0x5B47	0x25588	
+0x5B48	0x25589	
+0x5B49	0x2558A	
+0x5B4B	0x25707	
+0x5B4C	0x25708	
+0x5B4D	0x25701	
+0x5B4E	0x25709	
+0x5B4F	0x25702	
+0x5B50	0x2570A	
+0x5B51	0x2570B	
+0x5B52	0x2570C	
+0x5B53	0x258A7	
+0x5B54	0x25898	
+0x5B55	0x25899	
+0x5B56	0x2589A	
+0x5B57	0x2589B	
+0x5B58	0x2589C	
+0x5B5A	0x2589D	
+0x5B5B	0x25A1A	
+0x5B5C	0x25AB2	
+0x5B5D	0x25CB0	
+0x5B5E	0x25CB1	
+0x5B60	0x25CB2	
+0x5B61	0x25CB3	
+0x5B62	0x25CB4	
+0x5B63	0x25CB5	
+0x5B64	0x25CB6	
+0x5B65	0x25CC0	
+0x5B66	0x25CB7	
+0x5B67	0x25CB8	
+0x5B68	0x25CB9	
+0x5B69	0x25CBA	
+0x5B6A	0x25D1D	
+0x5B6B	0x25F0C	
+0x5B6C	0x25F0D	
+0x5B6D	0x25F0E	
+0x5B6E	0x25F35	
+0x5B6F	0x25F0F	
+0x5B70	0x25F10	
+0x5B71	0x25F11	
+0x5B72	0x25F12	
+0x5B73	0x26122	
+0x5B74	0x26123	
+0x5B75	0x26124	
+0x5B77	0x26125	
+0x5B78	0x26126	
+0x5B79	0x26127	
+0x5B7A	0x26128	
+0x5B7B	0x26129	
+0x5B7C	0x2612A	
+0x5B7D	0x2612B	
+0x5B7E	0x2612C	
+0x5C21	0x2612D	
+0x5C22	0x2612E	
+0x5C23	0x26252	
+0x5C24	0x26253	
+0x5C25	0x26319	
+0x5C26	0x263BF	
+0x5C27	0x2648B	
+0x5C28	0x2648C	
+0x5C29	0x26523	
+0x5C2A	0x26524	
+0x5C2B	0x265F1	
+0x5C2C	0x265D8	
+0x5C2D	0x2F97F	
+0x5C2E	0x2684E	
+0x5C2F	0x2684F	
+0x5C30	0x26855	
+0x5C31	0x26850	
+0x5C32	0x26851	
+0x5C33	0x26852	
+0x5C34	0x26853	
+0x5C35	0x26802	
+0x5C36	0x26854	
+0x5C37	0x268F1	
+0x5C38	0x26924	
+0x5C39	0x26AD1	
+0x5C3A	0x26F7C	
+0x5C3B	0x26F7D	
+0x5C3C	0x26F7E	
+0x5C3D	0x26F7F	
+0x5C3E	0x26F80	
+0x5C3F	0x26F9F	
+0x5C40	0x26F81	
+0x5C41	0x26F82	
+0x5C42	0x26F83	
+0x5C43	0x26F84	
+0x5C44	0x26F85	
+0x5C45	0x26F86	
+0x5C46	0x26F87	
+0x5C47	0x26F88	
+0x5C48	0x26F9B	
+0x5C49	0x26F89	
+0x5C4A	0x26F8A	
+0x5C4B	0x26F8B	
+0x5C4C	0x26F8C	
+0x5C4E	0x26FA1	
+0x5C4F	0x26F8D	
+0x5C50	0x26F8E	
+0x5C51	0x271F3	
+0x5C52	0x271F4	
+0x5C53	0x271F5	
+0x5C54	0x27424	
+0x5C55	0x27425	
+0x5C56	0x27426	
+0x5C57	0x27427	
+0x5C58	0x27428	
+0x5C59	0x27429	
+0x5C5A	0x2742A	
+0x5C5C	0x2742B	
+0x5C5D	0x275CD	
+0x5C5E	0x27601	
+0x5C5F	0x2258D	
+0x5C60	0x27770	
+0x5C61	0x27880	
+0x5C62	0x27881	
+0x5C63	0x27AC0	
+0x5C64	0x27AC1	
+0x5C65	0x27AC2	
+0x5C66	0x27AC3	
+0x5C67	0x27AC4	
+0x5C68	0x27AC5	
+0x5C69	0x27AC6	
+0x5C6A	0x27AC7	
+0x5C6B	0x27AC8	
+0x5C6C	0x27CFE	
+0x5C6E	0x27DD9	
+0x5C6F	0x27DDC	
+0x5C70	0x27DDA	
+0x5C71	0x27E75	
+0x5C72	0x27F58	
+0x5C73	0x27F59	
+0x5C74	0x27F5A	
+0x5C75	0x27F5B	
+0x5C76	0x27F5C	
+0x5C77	0x280EC	
+0x5C79	0x280F3	
+0x5C7A	0x28272	
+0x5C7B	0x28273	
+0x5C7C	0x28382	
+0x5C7D	0x28383	
+0x5C7E	0x2842A	
+0x5D21	0x2842B	
+0x5D22	0x2842C	
+0x5D23	0x2842D	
+0x5D24	0x285F6	
+0x5D25	0x28600	
+0x5D26	0x285F7	
+0x5D27	0x285F8	
+0x5D28	0x285F9	
+0x5D2A	0x28894	
+0x5D2B	0x28895	
+0x5D2C	0x28896	
+0x5D2D	0x2891B	
+0x5D2E	0x28A86	
+0x5D2F	0x28A4C	
+0x5D30	0x28A4D	
+0x5D31	0x28A83	
+0x5D33	0x28A82	
+0x5D34	0x28A4E	
+0x5D35	0x28A4F	
+0x5D36	0x28A50	
+0x5D37	0x28A51	
+0x5D38	0x28A81	
+0x5D3A	0x28A52	
+0x5D3B	0x28A53	
+0x5D3C	0x28A54	
+0x5D3D	0x28A55	
+0x5D3F	0x28A56	
+0x5D40	0x28A57	
+0x5D42	0x28A58	
+0x5D43	0x28A5B	
+0x5D44	0x28A5C	
+0x5D45	0x28A5D	
+0x5D46	0x28A5E	
+0x5D47	0x28A5F	
+0x5D48	0x28A60	
+0x5D49	0x28A61	
+0x5D4A	0x28A7C	
+0x5D4B	0x28A62	
+0x5D4E	0x28A63	
+0x5D4F	0x28A64	
+0x5D50	0x28D73	
+0x5D51	0x28F45	
+0x5D52	0x28F46	
+0x5D53	0x28F47	
+0x5D54	0x28F4C	
+0x5D55	0x29012	
+0x5D57	0x29013	
+0x5D58	0x29139	
+0x5D59	0x29103	
+0x5D5A	0x2910D	
+0x5D5B	0x29230	
+0x5D5C	0x292D5	
+0x5D5D	0x293C0	
+0x5D5E	0x294F2	
+0x5D5F	0x294F3	
+0x5D60	0x294F4	
+0x5D61	0x294F5	
+0x5D62	0x294F6	
+0x5D63	0x294F7	
+0x5D64	0x295FA	
+0x5D65	0x295FB	
+0x5D66	0x29745	
+0x5D67	0x29746	
+0x5D68	0x29849	
+0x5D69	0x298E7	
+0x5D6A	0x298E8	
+0x5D6B	0x29AD8	
+0x5D6C	0x29AD9	
+0x5D6D	0x29B55	
+0x5D6E	0x29B56	
+0x5D6F	0x29B57	
+0x5D70	0x29CDA	
+0x5D71	0x29CDB	
+0x5D72	0x29CDC	
+0x5D73	0x29DB8	
+0x5D74	0x29DB9	
+0x5D75	0x29DBA	
+0x5D77	0x29DBB	
+0x5D78	0x29F89	
+0x5D79	0x29DBC	
+0x5D7A	0x2A030	
+0x5D7B	0x2A031	
+0x5D7C	0x2A032	
+0x5D7D	0x2A033	
+0x5E21	0x2A034	
+0x5E22	0x2A035	
+0x5E23	0x2A036	
+0x5E25	0x2A037	
+0x5E26	0x2A2B2	
+0x5E27	0x2A390	
+0x5E28	0x2A326	
+0x5E29	0x2A3A2	
+0x5E2A	0x2A438	
+0x5E2C	0x2042E	
+0x5E2E	0x2042F	
+0x5E2F	0x20430	
+0x5E30	0x2042A	
+0x5E31	0x2042B	
+0x5E32	0x204C9	
+0x5E33	0x20537	
+0x5E34	0x20620	
+0x5E35	0x20672	
+0x5E36	0x2081F	
+0x5E37	0x20965	
+0x5E38	0x209CA	
+0x5E39	0x20AC0	
+0x5E3A	0x20AC1	
+0x5E3B	0x20AC2	
+0x5E3C	0x210B7	
+0x5E3D	0x210B8	
+0x5E3E	0x210B9	
+0x5E3F	0x210BA	
+0x5E40	0x210BB	
+0x5E43	0x210BC	
+0x5E44	0x210BD	
+0x5E45	0x210BE	
+0x5E46	0x210F2	
+0x5E47	0x214B5	
+0x5E48	0x214B7	
+0x5E49	0x214B8	
+0x5E4A	0x210DF	
+0x5E4B	0x214B9	
+0x5E4C	0x214D5	
+0x5E4D	0x214BA	
+0x5E4E	0x214BB	
+0x5E4F	0x2154A	
+0x5E50	0x218F2	
+0x5E51	0x218F3	
+0x5E52	0x218F4	
+0x5E53	0x218FA	
+0x5E54	0x218F5	
+0x5E55	0x21902	
+0x5E56	0x21AE2	
+0x5E57	0x21AE3	
+0x5E58	0x21F8E	
+0x5E59	0x21F8B	
+0x5E5A	0x222E4	
+0x5E5B	0x222EB	
+0x5E5C	0x222E5	
+0x5E5D	0x22435	
+0x5E5E	0x22593	
+0x5E5F	0x228EA	
+0x5E60	0x228EB	
+0x5E62	0x228EC	
+0x5E63	0x228ED	
+0x5E64	0x22917	
+0x5E65	0x228EE	
+0x5E66	0x228EF	
+0x5E67	0x228F0	
+0x5E68	0x22E0E	
+0x5E69	0x22E0F	
+0x5E6A	0x22E10	
+0x5E6B	0x22E19	
+0x5E6C	0x22E18	
+0x5E6D	0x22E11	
+0x5E6E	0x22E12	
+0x5E6F	0x22E13	
+0x5E70	0x2F8C7	
+0x5E71	0x22E14	
+0x5E72	0x22E15	
+0x5E74	0x22E16	
+0x5E75	0x23065	
+0x5E76	0x232EA	
+0x5E77	0x232EB	
+0x5E78	0x232EC	
+0x5E79	0x232ED	
+0x5E7B	0x232EE	
+0x5E7C	0x233AC	
+0x5E7D	0x237C2	
+0x5E7E	0x23769	
+0x5F21	0x23781	
+0x5F22	0x2376A	
+0x5F23	0x2376B	
+0x5F24	0x2376C	
+0x5F25	0x2376D	
+0x5F26	0x2376E	
+0x5F27	0x2376F	
+0x5F28	0x23770	
+0x5F2A	0x23771	
+0x5F2B	0x23772	
+0x5F2C	0x23773	
+0x5F2D	0x2378C	
+0x5F2E	0x23774	
+0x5F2F	0x23775	
+0x5F30	0x23776	
+0x5F31	0x23C24	
+0x5F32	0x23C2A	
+0x5F33	0x2408E	
+0x5F34	0x240AF	
+0x5F35	0x2408F	
+0x5F36	0x24090	
+0x5F37	0x24091	
+0x5F39	0x24092	
+0x5F3A	0x24093	
+0x5F3B	0x24094	
+0x5F3C	0x24095	
+0x5F3D	0x24096	
+0x5F3E	0x24097	
+0x5F3F	0x24098	
+0x5F40	0x24099	
+0x5F41	0x2409A	
+0x5F42	0x2409B	
+0x5F43	0x2409C	
+0x5F44	0x24439	
+0x5F45	0x2443B	
+0x5F46	0x2443A	
+0x5F47	0x2443C	
+0x5F48	0x2443D	
+0x5F49	0x2443E	
+0x5F4A	0x2443F	
+0x5F4B	0x24470	
+0x5F4C	0x24440	
+0x5F4D	0x24441	
+0x5F4E	0x248C0	
+0x5F4F	0x248C1	
+0x5F50	0x24AA4	
+0x5F51	0x24A97	
+0x5F52	0x24AA5	
+0x5F53	0x24A98	
+0x5F54	0x24A99	
+0x5F55	0x24A9A	
+0x5F57	0x24A9B	
+0x5F58	0x24AA6	
+0x5F59	0x24A9C	
+0x5F5A	0x24A9D	
+0x5F5B	0x24A9E	
+0x5F5C	0x24A9F	
+0x5F5D	0x28ACE	
+0x5F5E	0x24AC8	
+0x5F5F	0x24AA0	
+0x5F60	0x24B19	
+0x5F61	0x24C0D	
+0x5F62	0x250BF	
+0x5F63	0x252E9	
+0x5F64	0x252EA	
+0x5F65	0x255A2	
+0x5F66	0x255A3	
+0x5F67	0x255A4	
+0x5F68	0x255A5	
+0x5F69	0x255A6	
+0x5F6A	0x25715	
+0x5F6B	0x25717	
+0x5F6C	0x258BF	
+0x5F6D	0x258C0	
+0x5F6E	0x258C1	
+0x5F6F	0x258C2	
+0x5F70	0x258C3	
+0x5F71	0x258C4	
+0x5F72	0x258C5	
+0x5F73	0x2190D	
+0x5F74	0x25A23	
+0x5F75	0x25ABE	
+0x5F76	0x25D03	
+0x5F77	0x25D04	
+0x5F78	0x25D05	
+0x5F79	0x25D06	
+0x5F7A	0x25D07	
+0x5F7B	0x25D08	
+0x5F7C	0x25D09	
+0x5F7D	0x25D0A	
+0x5F7E	0x25D0B	
+0x6021	0x25D0C	
+0x6022	0x25D20	
+0x6023	0x25D0D	
+0x6024	0x25D0E	
+0x6025	0x25D0F	
+0x6027	0x25F26	
+0x6028	0x25F27	
+0x6029	0x25F28	
+0x602A	0x2615D	
+0x602B	0x2615E	
+0x602C	0x2615F	
+0x602D	0x26160	
+0x602E	0x26161	
+0x602F	0x26162	
+0x6030	0x26163	
+0x6031	0x26164	
+0x6032	0x26165	
+0x6033	0x26257	
+0x6034	0x263CF	
+0x6035	0x263D0	
+0x6036	0x26499	
+0x6037	0x2649A	
+0x6038	0x265EA	
+0x6039	0x265EB	
+0x603A	0x265EC	
+0x603B	0x2687E	
+0x603C	0x2687F	
+0x603D	0x26880	
+0x6040	0x26881	
+0x6041	0x26882	
+0x6042	0x268F3	
+0x6043	0x26925	
+0x6044	0x2699F	
+0x6045	0x269A0	
+0x6046	0x269F3	
+0x6047	0x26A00	
+0x6048	0x26FEB	
+0x6049	0x26FEC	
+0x604A	0x26FED	
+0x604B	0x26FEE	
+0x604C	0x26FEF	
+0x604F	0x26FF0	
+0x6050	0x26FF1	
+0x6051	0x26FF2	
+0x6052	0x26FF3	
+0x6053	0x26FF4	
+0x6054	0x26FF5	
+0x6055	0x26FF9	
+0x6056	0x26FFA	
+0x6057	0x26FFB	
+0x6058	0x26FFC	
+0x6059	0x26FFD	
+0x605A	0x26FFE	
+0x605B	0x26FFF	
+0x605C	0x27000	
+0x605D	0x2F9AE	
+0x605E	0x27001	
+0x605F	0x27002	
+0x6060	0x27203	
+0x6061	0x27486	
+0x6062	0x27479	
+0x6064	0x2747A	
+0x6065	0x2747B	
+0x6066	0x2747C	
+0x6067	0x27484	
+0x6068	0x2747D	
+0x6069	0x2747E	
+0x606A	0x2747F	
+0x606B	0x27786	
+0x606C	0x27787	
+0x606D	0x27800	
+0x606E	0x27801	
+0x606F	0x27888	
+0x6070	0x27889	
+0x6071	0x2788A	
+0x6072	0x27AF5	
+0x6074	0x27B25	
+0x6075	0x27AF6	
+0x6076	0x27DEB	
+0x6077	0x27DEC	
+0x6078	0x27DED	
+0x6079	0x27DEE	
+0x607B	0x27DEF	
+0x607C	0x27DF0	
+0x607D	0x27F6C	
+0x607E	0x28121	
+0x6121	0x28122	
+0x6122	0x28123	
+0x6123	0x28124	
+0x6124	0x28125	
+0x6125	0x28126	
+0x6126	0x2827B	
+0x6127	0x2827C	
+0x6128	0x28391	
+0x6129	0x28392	
+0x612A	0x28393	
+0x612B	0x2860E	
+0x612C	0x2860F	
+0x612D	0x28610	
+0x612E	0x288B3	
+0x612F	0x28936	
+0x6130	0x28AC6	
+0x6131	0x28AA1	
+0x6132	0x28AA2	
+0x6134	0x28AA3	
+0x6135	0x28ACC	
+0x6136	0x28AA4	
+0x6137	0x28AA5	
+0x6138	0x28AA6	
+0x6139	0x28ACB	
+0x613A	0x28AA7	
+0x613C	0x28AA8	
+0x613D	0x28AA9	
+0x613E	0x28AAA	
+0x6140	0x28AAB	
+0x6141	0x28AAC	
+0x6142	0x28AAD	
+0x6144	0x28AAE	
+0x6145	0x28AAF	
+0x6146	0x28AB0	
+0x6147	0x28D8C	
+0x6148	0x28D8D	
+0x6149	0x28D8E	
+0x614A	0x2F9F1	
+0x614B	0x28D92	
+0x614C	0x28D8F	
+0x614D	0x28F52	
+0x614E	0x28F53	
+0x614F	0x28F54	
+0x6150	0x28F55	
+0x6151	0x29129	
+0x6153	0x292F3	
+0x6154	0x292F4	
+0x6155	0x2950D	
+0x6156	0x2950E	
+0x6157	0x2950F	
+0x6158	0x29510	
+0x6159	0x29614	
+0x615A	0x29771	
+0x615B	0x29772	
+0x615C	0x2990F	
+0x615D	0x29904	
+0x615E	0x29906	
+0x6160	0x29907	
+0x6161	0x29ADC	
+0x6162	0x29ADD	
+0x6163	0x29B6D	
+0x6164	0x29B79	
+0x6165	0x29B6E	
+0x6167	0x29CEC	
+0x6168	0x29DDD	
+0x6169	0x29DDE	
+0x616A	0x29DDF	
+0x616B	0x29DE0	
+0x616C	0x29DE1	
+0x616D	0x29DE2	
+0x616E	0x29DE3	
+0x616F	0x29DE4	
+0x6170	0x29E3A	
+0x6171	0x29DE5	
+0x6173	0x29DE6	
+0x6174	0x2A06B	
+0x6175	0x2A06C	
+0x6176	0x2444E	
+0x6178	0x2A2BD	
+0x6179	0x2A2BE	
+0x617A	0x2A2BF	
+0x617B	0x2A334	
+0x617D	0x2A512	
+0x617E	0x20440	
+0x6221	0x20441	
+0x6222	0x21102	
+0x6223	0x21103	
+0x6224	0x21104	
+0x6225	0x21105	
+0x6226	0x21106	
+0x6227	0x214D7	
+0x6228	0x214CC	
+0x6229	0x21698	
+0x622A	0x21906	
+0x622B	0x21907	
+0x622C	0x219AF	
+0x622D	0x219B0	
+0x622E	0x21AEA	
+0x622F	0x21AF2	
+0x6230	0x21FA2	
+0x6231	0x21FA3	
+0x6232	0x21FA4	
+0x6233	0x22176	
+0x6234	0x222F5	
+0x6235	0x222F6	
+0x6236	0x222F7	
+0x6238	0x2293B	
+0x6239	0x22925	
+0x623A	0x2293A	
+0x623B	0x2293C	
+0x623C	0x2293D	
+0x623D	0x2293E	
+0x623E	0x22E37	
+0x623F	0x22E38	
+0x6240	0x22E39	
+0x6241	0x22E3A	
+0x6242	0x22E3B	
+0x6243	0x22E3C	
+0x6244	0x22E3D	
+0x6245	0x22E3E	
+0x6246	0x22E3F	
+0x6247	0x22E4B	
+0x6249	0x22E40	
+0x624A	0x23022	
+0x624B	0x23067	
+0x624C	0x230D3	
+0x624D	0x232FA	
+0x624F	0x237BC	
+0x6252	0x237A5	
+0x6254	0x237B6	
+0x6256	0x237A6	
+0x6257	0x237BB	
+0x6258	0x237A7	
+0x6259	0x237A8	
+0x625A	0x237A9	
+0x625B	0x237AA	
+0x625C	0x237AB	
+0x625D	0x237AC	
+0x625E	0x237BF	
+0x625F	0x237AD	
+0x6260	0x237AE	
+0x6261	0x237AF	
+0x6262	0x2392E	
+0x6263	0x23B00	
+0x6264	0x2409D	
+0x6265	0x2409E	
+0x6266	0x240CB	
+0x6267	0x240CC	
+0x6268	0x240CD	
+0x6269	0x240CE	
+0x626A	0x240CF	
+0x626C	0x2409F	
+0x626D	0x240D0	
+0x626E	0x240D1	
+0x626F	0x240D2	
+0x6270	0x240D3	
+0x6271	0x240D4	
+0x6274	0x2445D	
+0x6275	0x2445E	
+0x6276	0x2445F	
+0x6277	0x24460	
+0x6279	0x24ABA	
+0x627A	0x24ABC	
+0x627C	0x24AB5	
+0x627D	0x24ABD	
+0x627E	0x24AB6	
+0x6321	0x24AB7	
+0x6322	0x24AB8	
+0x6323	0x24AA8	
+0x6324	0x2F932	
+0x6325	0x24BFE	
+0x6326	0x24BFC	
+0x6327	0x24EE1	
+0x6328	0x250C4	
+0x6329	0x250C5	
+0x632A	0x25314	
+0x632B	0x255AE	
+0x632C	0x255AF	
+0x632D	0x255B0	
+0x632E	0x255B1	
+0x632F	0x255B9	
+0x6330	0x258E7	
+0x6331	0x25D46	
+0x6333	0x25D47	
+0x6334	0x25D48	
+0x6335	0x25D49	
+0x6336	0x25D1E	
+0x6337	0x25D1F	
+0x6338	0x25D4A	
+0x6339	0x25D4B	
+0x633A	0x25D4C	
+0x633B	0x25D4D	
+0x633C	0x25D4E	
+0x633E	0x25F46	
+0x633F	0x25F4B	
+0x6340	0x26190	
+0x6341	0x26191	
+0x6343	0x26192	
+0x6344	0x26193	
+0x6345	0x26194	
+0x6346	0x2625B	
+0x6347	0x265F2	
+0x6348	0x265F8	
+0x6349	0x265F9	
+0x634A	0x26894	
+0x634B	0x268A4	
+0x634C	0x26897	
+0x634D	0x26898	
+0x634E	0x26929	
+0x634F	0x269AE	
+0x6350	0x26AAF	
+0x6351	0x27059	
+0x6352	0x2705A	
+0x6354	0x2705B	
+0x6355	0x2705C	
+0x6356	0x2705D	
+0x6357	0x2705E	
+0x6358	0x2705F	
+0x6359	0x27060	
+0x635A	0x27061	
+0x635B	0x26FAA	
+0x635C	0x27062	
+0x635D	0x27063	
+0x635E	0x27064	
+0x635F	0x27065	
+0x6360	0x27066	
+0x6361	0x27067	
+0x6362	0x27068	
+0x6363	0x27069	
+0x6364	0x2706A	
+0x6365	0x2706B	
+0x6366	0x2706C	
+0x6367	0x2706D	
+0x6368	0x2706E	
+0x6369	0x2706F	
+0x636B	0x274B2	
+0x636C	0x274B3	
+0x636D	0x274B4	
+0x636F	0x274B5	
+0x6370	0x274B6	
+0x6371	0x274B7	
+0x6372	0x274B8	
+0x6373	0x274B9	
+0x6374	0x274BA	
+0x6375	0x274BB	
+0x6376	0x27788	
+0x6378	0x27B19	
+0x6379	0x27B1A	
+0x637A	0x27B1B	
+0x637B	0x27C16	
+0x637C	0x27E0C	
+0x637D	0x27E0D	
+0x637E	0x27E0E	
+0x6421	0x27E0F	
+0x6423	0x27F83	
+0x6424	0x27F84	
+0x6425	0x27F85	
+0x6426	0x28283	
+0x6427	0x28284	
+0x6428	0x283B0	
+0x642A	0x28626	
+0x642B	0x28627	
+0x642C	0x28636	
+0x642D	0x28628	
+0x642E	0x28629	
+0x6431	0x28AE7	
+0x6432	0x28AE8	
+0x6433	0x28AE9	
+0x6435	0x28AEA	
+0x6436	0x28AEB	
+0x6438	0x28AEC	
+0x6439	0x28AED	
+0x643A	0x28AEE	
+0x643B	0x28AEF	
+0x643C	0x28AF0	
+0x643D	0x28AF1	
+0x643E	0x28B0C	
+0x643F	0x28AF2	
+0x6440	0x28AF3	
+0x6441	0x28AF4	
+0x6442	0x28AF5	
+0x6443	0x28AF6	
+0x6444	0x28AF7	
+0x6445	0x28AF8	
+0x6446	0x28DA3	
+0x6447	0x28DA4	
+0x6448	0x28DA5	
+0x6449	0x28DA6	
+0x644A	0x28DA7	
+0x644C	0x28F5C	
+0x644E	0x2914B	
+0x644F	0x291E1	
+0x6450	0x29315	
+0x6452	0x29316	
+0x6453	0x29317	
+0x6454	0x2952C	
+0x6455	0x2952D	
+0x6456	0x29622	
+0x6457	0x29623	
+0x6458	0x29796	
+0x6459	0x29797	
+0x645B	0x2992E	
+0x645C	0x29930	
+0x645D	0x29931	
+0x645F	0x29ADF	
+0x6460	0x29B8B	
+0x6461	0x29B8C	
+0x6463	0x29B8D	
+0x6464	0x29CFC	
+0x6465	0x29CFD	
+0x6466	0x29CFE	
+0x6467	0x29CFF	
+0x6468	0x29E17	
+0x6469	0x29E2D	
+0x646A	0x29E18	
+0x646C	0x29E19	
+0x646E	0x29E12	
+0x646F	0x29E1A	
+0x6470	0x29E1B	
+0x6471	0x29E1C	
+0x6474	0x2A097	
+0x6476	0x2A098	
+0x6477	0x2A099	
+0x6479	0x2A3C4	
+0x647A	0x2044F	
+0x647B	0x204CD	
+0x647C	0x20AC7	
+0x647D	0x2111C	
+0x647E	0x2111D	
+0x6521	0x2111E	
+0x6522	0x214E7	
+0x6523	0x214E9	
+0x6524	0x214EA	
+0x6525	0x214EB	
+0x6526	0x21915	
+0x6527	0x21CF1	
+0x6528	0x21CF2	
+0x6529	0x21FB6	
+0x652A	0x225A0	
+0x652B	0x2294A	
+0x652C	0x22A20	
+0x652D	0x22E60	
+0x652E	0x22E61	
+0x652F	0x22E41	
+0x6530	0x22E62	
+0x6531	0x23303	
+0x6532	0x23304	
+0x6533	0x237D9	
+0x6534	0x237DA	
+0x6535	0x237DB	
+0x6536	0x237DC	
+0x6537	0x237DD	
+0x6539	0x237DE	
+0x653A	0x237DF	
+0x653B	0x237E0	
+0x653C	0x237E1	
+0x653D	0x237E2	
+0x653F	0x237E3	
+0x6541	0x23C31	
+0x6542	0x24105	
+0x6543	0x24106	
+0x6544	0x24107	
+0x6545	0x24472	
+0x6546	0x2448A	
+0x6547	0x2448B	
+0x6548	0x24488	
+0x654A	0x2448C	
+0x654B	0x2448D	
+0x654C	0x2448E	
+0x654D	0x2448F	
+0x654E	0x24490	
+0x654F	0x24542	
+0x6550	0x24543	
+0x6552	0x24AC1	
+0x6553	0x24AC2	
+0x6554	0x24AC3	
+0x6555	0x24AC4	
+0x6556	0x250CB	
+0x6557	0x25322	
+0x655A	0x255C3	
+0x655B	0x255C4	
+0x655C	0x255C5	
+0x655D	0x255C6	
+0x655E	0x2571E	
+0x655F	0x25725	
+0x6560	0x258F3	
+0x6561	0x258F4	
+0x6563	0x258F5	
+0x6564	0x25A38	
+0x6565	0x25A48	
+0x6566	0x25ACA	
+0x6568	0x25D7A	
+0x6569	0x25D7B	
+0x656A	0x25F55	
+0x656B	0x25F56	
+0x656C	0x261B1	
+0x656D	0x261B2	
+0x656E	0x261B3	
+0x6570	0x261B4	
+0x6571	0x261B5	
+0x6572	0x264A4	
+0x6573	0x26600	
+0x6574	0x26601	
+0x6575	0x26602	
+0x6576	0x268AC	
+0x6578	0x269B3	
+0x6579	0x270B6	
+0x657A	0x270B7	
+0x657B	0x270B8	
+0x657C	0x270B9	
+0x657D	0x270BA	
+0x657E	0x270BB	
+0x6621	0x270BC	
+0x6622	0x270BD	
+0x6623	0x270BE	
+0x6624	0x270BF	
+0x6625	0x270C0	
+0x6626	0x270C1	
+0x6627	0x270C2	
+0x6628	0x270C3	
+0x6629	0x270C4	
+0x662A	0x270C5	
+0x662B	0x270C6	
+0x662C	0x270C7	
+0x662D	0x274E3	
+0x662E	0x274E4	
+0x662F	0x274E5	
+0x6630	0x274E6	
+0x6631	0x274E7	
+0x6633	0x277B5	
+0x6634	0x277A1	
+0x6635	0x27895	
+0x6636	0x27B3B	
+0x6637	0x27B3C	
+0x6638	0x27B3D	
+0x6639	0x27B3E	
+0x663A	0x27C14	
+0x663B	0x27E20	
+0x663C	0x27E21	
+0x663D	0x27E22	
+0x663E	0x27E23	
+0x663F	0x27E24	
+0x6640	0x27F96	
+0x6641	0x27F97	
+0x6642	0x27F98	
+0x6643	0x28194	
+0x6644	0x28195	
+0x6645	0x28196	
+0x6646	0x28197	
+0x6647	0x28198	
+0x6648	0x2828F	
+0x6649	0x28290	
+0x664A	0x283BC	
+0x664B	0x2843B	
+0x664C	0x2863D	
+0x664E	0x288DF	
+0x664F	0x2891E	
+0x6650	0x28B23	
+0x6651	0x28B24	
+0x6652	0x28B49	
+0x6653	0x28B25	
+0x6654	0x28B26	
+0x6655	0x28B27	
+0x6656	0x28B28	
+0x6658	0x28B29	
+0x6659	0x28B2A	
+0x665A	0x28B2E	
+0x665B	0x28B2F	
+0x665C	0x28B4E	
+0x665D	0x28B30	
+0x665E	0x2F9EB	
+0x665F	0x28B31	
+0x6660	0x28B32	
+0x6661	0x28B33	
+0x6662	0x28B34	
+0x6663	0x28B35	
+0x6664	0x28B36	
+0x6666	0x28B37	
+0x6667	0x28B50	
+0x6668	0x28B38	
+0x666A	0x28B39	
+0x666B	0x28B3A	
+0x666C	0x28B3B	
+0x666D	0x28B3C	
+0x666E	0x28B3D	
+0x666F	0x28B3E	
+0x6670	0x28DB8	
+0x6671	0x28DB9	
+0x6672	0x28F62	
+0x6673	0x28F63	
+0x6674	0x29041	
+0x6675	0x2916D	
+0x6677	0x29352	
+0x6678	0x29337	
+0x6679	0x293DB	
+0x667A	0x2953F	
+0x667B	0x29634	
+0x667C	0x2985B	
+0x667D	0x29946	
+0x667E	0x2995A	
+0x6721	0x2995B	
+0x6722	0x29AE1	
+0x6723	0x29AE2	
+0x6724	0x29AE3	
+0x6725	0x29AE4	
+0x6726	0x29BA7	
+0x6727	0x29BA8	
+0x6728	0x29BA9	
+0x6729	0x29D0F	
+0x672A	0x29D2B	
+0x672B	0x29E56	
+0x672C	0x29E57	
+0x672D	0x29E58	
+0x672E	0x29E5E	
+0x672F	0x29E59	
+0x6730	0x29E5A	
+0x6731	0x29E5B	
+0x6732	0x29E5C	
+0x6734	0x29E68	
+0x6736	0x2A12C	
+0x6737	0x2A0E2	
+0x6738	0x2A0F3	
+0x6739	0x2A2D2	
+0x673A	0x2A356	
+0x673B	0x2A3CE	
+0x673C	0x2A461	
+0x673D	0x2A69B	
+0x673E	0x2A6B4	
+0x673F	0x2045C	
+0x6740	0x2F810	
+0x6741	0x204D2	
+0x6742	0x20571	
+0x6743	0x20673	
+0x6744	0x2082C	
+0x6745	0x20B94	
+0x6747	0x2113F	
+0x6748	0x21140	
+0x6749	0x214F9	
+0x674A	0x214FA	
+0x674B	0x214FD	
+0x674C	0x214FB	
+0x674D	0x2191C	
+0x674E	0x2191D	
+0x674F	0x21AFF	
+0x6750	0x21B00	
+0x6751	0x21CF7	
+0x6752	0x24CFE	
+0x6754	0x224B6	
+0x6755	0x22954	
+0x6756	0x22E77	
+0x6757	0x22E79	
+0x6758	0x22E7A	
+0x6759	0x22E7B	
+0x675A	0x23069	
+0x675B	0x23802	
+0x675C	0x23803	
+0x675D	0x23804	
+0x675E	0x23805	
+0x675F	0x23806	
+0x6760	0x23807	
+0x6761	0x23808	
+0x6762	0x23809	
+0x6763	0x2380A	
+0x6764	0x2380B	
+0x6765	0x23835	
+0x6767	0x23C39	
+0x6768	0x2411E	
+0x6769	0x2411F	
+0x676A	0x24120	
+0x676B	0x24121	
+0x676D	0x24122	
+0x676E	0x24123	
+0x676F	0x24124	
+0x6770	0x2412C	
+0x6771	0x244B3	
+0x6772	0x244B5	
+0x6773	0x244B6	
+0x6774	0x244B7	
+0x6775	0x244B8	
+0x6776	0x24AD0	
+0x6777	0x24CFA	
+0x6778	0x24F07	
+0x6779	0x24FBD	
+0x677A	0x250D7	
+0x677B	0x250D2	
+0x677C	0x255DB	
+0x677D	0x255D6	
+0x677E	0x2045D	
+0x6821	0x25A43	
+0x6822	0x25ACF	
+0x6823	0x25DA3	
+0x6824	0x25DA4	
+0x6825	0x25DA5	
+0x6826	0x25DA6	
+0x6827	0x25DA7	
+0x6828	0x25DA8	
+0x6829	0x25DA9	
+0x682A	0x25F5D	
+0x682B	0x25F5E	
+0x682C	0x261C9	
+0x682D	0x261CA	
+0x682E	0x261CB	
+0x682F	0x261CC	
+0x6830	0x26606	
+0x6831	0x26607	
+0x6833	0x268C5	
+0x6834	0x268F5	
+0x6835	0x269B4	
+0x6836	0x269B8	
+0x6837	0x269B5	
+0x6838	0x270FD	
+0x683A	0x270FE	
+0x683B	0x270FF	
+0x683C	0x27100	
+0x683D	0x27101	
+0x683E	0x27102	
+0x683F	0x27103	
+0x6840	0x27109	
+0x6841	0x27104	
+0x6842	0x27105	
+0x6843	0x27106	
+0x6844	0x27107	
+0x6845	0x27511	
+0x6846	0x27512	
+0x6847	0x27513	
+0x6848	0x27514	
+0x6849	0x27515	
+0x684B	0x27898	
+0x684C	0x27899	
+0x684D	0x27E3C	
+0x684E	0x27E2D	
+0x684F	0x27E2E	
+0x6851	0x281BB	
+0x6852	0x281BC	
+0x6854	0x2843D	
+0x6855	0x28647	
+0x6856	0x28648	
+0x6857	0x28649	
+0x6858	0x2864A	
+0x6859	0x287E1	
+0x685A	0x287E7	
+0x685B	0x288EB	
+0x685C	0x28920	
+0x685D	0x28938	
+0x685E	0x28B62	
+0x685F	0x28B67	
+0x6860	0x28B68	
+0x6861	0x28B69	
+0x6862	0x28B6A	
+0x6863	0x28B6B	
+0x6864	0x28B6D	
+0x6865	0x28B6E	
+0x6866	0x28B6F	
+0x6867	0x28B70	
+0x6868	0x28B71	
+0x6869	0x28B72	
+0x686A	0x28B8F	
+0x686B	0x28B73	
+0x686C	0x28B74	
+0x686D	0x28B75	
+0x686E	0x28B76	
+0x686F	0x28B77	
+0x6870	0x28DC9	
+0x6871	0x28DCA	
+0x6873	0x28DCB	
+0x6874	0x28DCC	
+0x6875	0x28DCD	
+0x6876	0x29051	
+0x6879	0x29245	
+0x687A	0x29559	
+0x687B	0x2955A	
+0x687C	0x2955B	
+0x687D	0x29640	
+0x687E	0x297CF	
+0x6921	0x2985E	
+0x6922	0x2997B	
+0x6923	0x29A93	
+0x6924	0x29BBC	
+0x6925	0x29D16	
+0x6926	0x29D30	
+0x6928	0x29E8D	
+0x6929	0x29E8E	
+0x692B	0x29E8F	
+0x692C	0x29E90	
+0x692D	0x29E91	
+0x692E	0x29E92	
+0x692F	0x29E93	
+0x6930	0x29E94	
+0x6931	0x29E95	
+0x6932	0x29E96	
+0x6933	0x2A123	
+0x6934	0x2A114	
+0x6935	0x2A2DB	
+0x6936	0x2A40A	
+0x6937	0x2A5CE	
+0x6938	0x20466	
+0x6939	0x20468	
+0x693A	0x20467	
+0x693B	0x204D3	
+0x693C	0x21163	
+0x693D	0x21504	
+0x693E	0x2169E	
+0x693F	0x21926	
+0x6940	0x2192A	
+0x6941	0x2296C	
+0x6942	0x22964	
+0x6943	0x22E8F	
+0x6944	0x22E90	
+0x6945	0x23034	
+0x6946	0x2330E	
+0x6947	0x23825	
+0x6948	0x23826	
+0x6949	0x23827	
+0x694B	0x23828	
+0x694E	0x23829	
+0x694F	0x2382A	
+0x6950	0x2382B	
+0x6951	0x2382C	
+0x6952	0x23C3E	
+0x6953	0x24142	
+0x6954	0x24143	
+0x6955	0x24133	
+0x6956	0x244C1	
+0x6957	0x244C2	
+0x6958	0x244C3	
+0x6959	0x24AD6	
+0x695A	0x24AD7	
+0x695B	0x255E1	
+0x695C	0x255E2	
+0x695D	0x2572B	
+0x695E	0x25AD1	
+0x695F	0x25DCC	
+0x6960	0x25DCD	
+0x6961	0x25DCE	
+0x6962	0x25DCF	
+0x6963	0x261DE	
+0x6964	0x261DF	
+0x6965	0x261E0	
+0x6966	0x261E1	
+0x6967	0x268F6	
+0x6968	0x2712C	
+0x696A	0x27154	
+0x696B	0x2712D	
+0x696C	0x2712E	
+0x696D	0x27541	
+0x696E	0x27542	
+0x696F	0x277C7	
+0x6970	0x278A0	
+0x6971	0x278A1	
+0x6972	0x27B70	
+0x6973	0x27B71	
+0x6974	0x27B72	
+0x6976	0x27E34	
+0x6977	0x27E35	
+0x6978	0x27E36	
+0x6979	0x27FA6	
+0x697A	0x281CC	
+0x697C	0x28299	
+0x697D	0x288F4	
+0x697E	0x28B9B	
+0x6A21	0x28B9E	
+0x6A22	0x28B9F	
+0x6A23	0x28BA0	
+0x6A24	0x28BA1	
+0x6A25	0x28BA2	
+0x6A26	0x28BA3	
+0x6A27	0x28BA4	
+0x6A28	0x28BA5	
+0x6A29	0x28BA6	
+0x6A2A	0x28BA7	
+0x6A2B	0x28BA8	
+0x6A2C	0x28DDB	
+0x6A2D	0x28DDC	
+0x6A2E	0x28DDD	
+0x6A2F	0x28DD7	
+0x6A30	0x28DDE	
+0x6A31	0x28DDF	
+0x6A32	0x29059	
+0x6A33	0x29446	
+0x6A34	0x29565	
+0x6A35	0x29649	
+0x6A37	0x297DD	
+0x6A38	0x29995	
+0x6A39	0x29996	
+0x6A3A	0x29997	
+0x6A3B	0x29BD4	
+0x6A3C	0x29BD6	
+0x6A3D	0x29D26	
+0x6A40	0x29EC8	
+0x6A41	0x29EC5	
+0x6A42	0x29EC6	
+0x6A43	0x29EC7	
+0x6A44	0x2A151	
+0x6A45	0x2A152	
+0x6A46	0x2A153	
+0x6A47	0x2A154	
+0x6A48	0x2A155	
+0x6A49	0x2A2DE	
+0x6A4B	0x2046D	
+0x6A4C	0x204D5	
+0x6A4D	0x21172	
+0x6A4E	0x221AE	
+0x6A4F	0x2230F	
+0x6A50	0x2296B	
+0x6A51	0x2296D	
+0x6A52	0x2296E	
+0x6A53	0x22978	
+0x6A54	0x22E98	
+0x6A55	0x22E99	
+0x6A56	0x22E9A	
+0x6A57	0x23844	
+0x6A58	0x2385C	
+0x6A59	0x23845	
+0x6A5A	0x23B01	
+0x6A5B	0x24158	
+0x6A5C	0x24159	
+0x6A5D	0x2415A	
+0x6A5F	0x244D9	
+0x6A60	0x244D6	
+0x6A61	0x24ADA	
+0x6A62	0x24ADF	
+0x6A63	0x24ADB	
+0x6A64	0x24D03	
+0x6A65	0x255EF	
+0x6A67	0x25733	
+0x6A68	0x25AD2	
+0x6A69	0x25DE1	
+0x6A6A	0x25F6F	
+0x6A6B	0x26264	
+0x6A6C	0x2660E	
+0x6A6D	0x27150	
+0x6A6E	0x27151	
+0x6A6F	0x27152	
+0x6A70	0x27556	
+0x6A71	0x27557	
+0x6A72	0x27558	
+0x6A74	0x27B81	
+0x6A75	0x27B82	
+0x6A76	0x27C1D	
+0x6A77	0x27C1E	
+0x6A78	0x27E43	
+0x6A79	0x27FAA	
+0x6A7A	0x288FD	
+0x6A7C	0x28BC6	
+0x6A7D	0x28BC7	
+0x6A7E	0x28BD9	
+0x6B21	0x28BD7	
+0x6B23	0x28BC8	
+0x6B24	0x28BC9	
+0x6B25	0x28BCA	
+0x6B26	0x28BCB	
+0x6B27	0x28BDA	
+0x6B29	0x28BCC	
+0x6B2A	0x28BCD	
+0x6B2B	0x28BCE	
+0x6B2C	0x28BCF	
+0x6B2D	0x28BD0	
+0x6B2E	0x28BD1	
+0x6B2F	0x28BBC	
+0x6B30	0x28DE1	
+0x6B31	0x28DE2	
+0x6B32	0x28DE3	
+0x6B33	0x291A9	
+0x6B34	0x2924E	
+0x6B35	0x29577	
+0x6B38	0x299AC	
+0x6B39	0x299AD	
+0x6B3A	0x29AB6	
+0x6B3B	0x29BE5	
+0x6B3C	0x29EF8	
+0x6B3D	0x29EEA	
+0x6B3E	0x29F8D	
+0x6B3F	0x29EEB	
+0x6B40	0x2A195	
+0x6B41	0x2046E	
+0x6B42	0x204D8	
+0x6B43	0x21183	
+0x6B44	0x216A3	
+0x6B45	0x21930	
+0x6B46	0x21B0F	
+0x6B47	0x22979	
+0x6B48	0x2297A	
+0x6B49	0x22EA7	
+0x6B4A	0x22EA8	
+0x6B4B	0x22EA9	
+0x6B4C	0x22EAA	
+0x6B4D	0x23319	
+0x6B4E	0x23850	
+0x6B4F	0x23851	
+0x6B50	0x23852	
+0x6B52	0x23868	
+0x6B53	0x23853	
+0x6B54	0x23854	
+0x6B55	0x248E2	
+0x6B56	0x24ADC	
+0x6B57	0x25915	
+0x6B58	0x25916	
+0x6B59	0x25A4F	
+0x6B5A	0x25DF5	
+0x6B5B	0x25DF6	
+0x6B5C	0x25DF7	
+0x6B5D	0x261F4	
+0x6B5E	0x264CC	
+0x6B5F	0x2660F	
+0x6B60	0x27166	
+0x6B61	0x27167	
+0x6B63	0x27168	
+0x6B64	0x278A4	
+0x6B65	0x27B8B	
+0x6B66	0x27B8C	
+0x6B67	0x281FA	
+0x6B68	0x28BE6	
+0x6B69	0x28BED	
+0x6B6A	0x28BEE	
+0x6B6B	0x28BEF	
+0x6B6C	0x28BF0	
+0x6B6D	0x28BFE	
+0x6B6E	0x28DE7	
+0x6B6F	0x28DE8	
+0x6B70	0x291B3	
+0x6B71	0x291E4	
+0x6B72	0x29583	
+0x6B73	0x29AEC	
+0x6B75	0x29F16	
+0x6B78	0x29F17	
+0x6B79	0x2A1C3	
+0x6B7A	0x2A1AC	
+0x6B7B	0x2A2ED	
+0x6B7E	0x2A5B4	
+0x6C22	0x2118A	
+0x6C23	0x2118B	
+0x6C24	0x21934	
+0x6C25	0x21B14	
+0x6C26	0x21FDF	
+0x6C27	0x224BB	
+0x6C28	0x2297F	
+0x6C29	0x22981	
+0x6C2A	0x22EAD	
+0x6C2B	0x22EAE	
+0x6C2C	0x23862	
+0x6C2D	0x2386E	
+0x6C2F	0x2416E	
+0x6C31	0x24717	
+0x6C32	0x24AE6	
+0x6C33	0x24C10	
+0x6C34	0x25919	
+0x6C36	0x26610	
+0x6C37	0x26AF2	
+0x6C38	0x27176	
+0x6C39	0x27177	
+0x6C3A	0x27B95	
+0x6C3B	0x27B96	
+0x6C3C	0x28C00	
+0x6C3D	0x28C01	
+0x6C3E	0x28C31	
+0x6C3F	0x2F9ED	
+0x6C40	0x28C1C	
+0x6C41	0x2906D	
+0x6C42	0x29BF4	
+0x6C43	0x29BF5	
+0x6C44	0x29D3D	
+0x6C45	0x29F32	
+0x6C46	0x29F33	
+0x6C47	0x2A2F4	
+0x6C49	0x20473	
+0x6C4A	0x21937	
+0x6C4C	0x23871	
+0x6C4D	0x25E0F	
+0x6C4F	0x25E0E	
+0x6C50	0x26611	
+0x6C51	0x27185	
+0x6C52	0x28C14	
+0x6C53	0x28C15	
+0x6C54	0x28C16	
+0x6C55	0x28C17	
+0x6C56	0x28C18	
+0x6C57	0x28C19	
+0x6C58	0x28C1A	
+0x6C59	0x291C3	
+0x6C5A	0x29F42	
+0x6C5B	0x29F43	
+0x6C5C	0x29F44	
+0x6C5D	0x29F48	
+0x6C5E	0x2A1FB	
+0x6C5F	0x216A5	
+0x6C60	0x219B8	
+0x6C61	0x22EB2	
+0x6C62	0x2303D	
+0x6C63	0x23872	
+0x6C64	0x244E7	
+0x6C65	0x244E8	
+0x6C66	0x25359	
+0x6C67	0x2573A	
+0x6C68	0x25E14	
+0x6C69	0x261FF	
+0x6C6A	0x269C0	
+0x6C6B	0x2718D	
+0x6C6D	0x2718E	
+0x6C6F	0x28C22	
+0x6C72	0x29C04	
+0x6C73	0x29C29	
+0x6C74	0x29F51	
+0x6C75	0x29F66	
+0x6C76	0x2A20E	
+0x6C77	0x2FA13	
+0x6C79	0x2119B	
+0x6C7A	0x2119C	
+0x6C7B	0x22316	
+0x6C7C	0x22986	
+0x6C7D	0x22987	
+0x6D21	0x28C2C	
+0x6D22	0x28C30	
+0x6D23	0x28C28	
+0x6D24	0x2965F	
+0x6D26	0x2417E	
+0x6D27	0x25E19	
+0x6D28	0x2820A	
+0x6D29	0x28C36	
+0x6D2A	0x28DFC	
+0x6D2B	0x29F6D	
+0x6D2C	0x29F6E	
+0x6D2D	0x2A6C6	
+0x6D2F	0x2387B	
+0x6D30	0x26206	
+0x6D31	0x2759F	
+0x6D32	0x2A232	
+0x6D33	0x2820D	
+0x6D34	0x2298B	
+0x6D35	0x28C3B	
+0x6D37	0x2A23D	
+0x6D38	0x28C3C	
+0x6D39	0x28C3D	
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates
new file mode 100644
index 0000000..b9f55b0
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates
@@ -0,0 +1,71 @@
+0x2144	0x2000B
+0x214F	0x2F817
+0x216F	0x201A9
+0x217C	0x2F850
+0x2225	0x2F82A
+0x227B	0x2F815
+0x2329	0x2F82C
+0x233C	0x2F83B
+0x2359	0x21D46
+0x2424	0x23C86
+0x2429	0x2F835
+0x2441	0x2F81B
+0x2452	0x2F80E
+0x257E	0x225D7
+0x2627	0x2F8B2
+0x272A	0x2F98F
+0x274E	0x20209
+0x2753	0x2F80F
+0x2754	0x2F811
+0x275C	0x206EC
+0x2A39	0x2233F
+0x2A45	0x2592E
+0x2C40	0x2F87A
+0x2C51	0x2F899
+0x2D35	0x2F8DF
+0x2D52	0x2F8FE
+0x2E56	0x2F96A
+0x2E5A	0x25133
+0x3023	0x2F841
+0x3053	0x2172E
+0x315C	0x2F8E1
+0x3350	0x2F983
+0x3460	0x20DAE
+0x3470	0x2F855
+0x347E	0x21637
+0x355F	0x2F88D
+0x3565	0x2F89C
+0x3628	0x2F8BA
+0x3640	0x2F8CB
+0x3675	0x2F907
+0x3977	0x20564
+0x3A26	0x2F833
+0x3A4F	0x21364
+0x3C3A	0x2F8E5
+0x3D3F	0x2F934
+0x3F6D	0x28CDD
+0x4043	0x2F823
+0x407E	0x2F87E
+0x416E	0x2F8E8
+0x4333	0x2F94E
+0x4425	0x2F98D
+0x446D	0x2F9DB
+0x4670	0x2F8A6
+0x4731	0x230BA
+0x474B	0x235F3
+0x4826	0x24A0F
+0x486A	0x2F96C
+0x5039	0x20B89
+0x5460	0x2F8AF
+0x553A	0x24039
+0x5545	0x2F921
+0x5678	0x2F9F5
+0x5736	0x29937
+0x584F	0x25CD1
+0x5863	0x265DF
+0x5A33	0x2F86A
+0x5A36	0x2F870
+0x5B26	0x2F9B6
+0x5B2D	0x2F9C1
+0x5C2F	0x2FA19
+0x607C	0x2F9D6
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates
new file mode 100644
index 0000000..501fc19
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates
@@ -0,0 +1,3476 @@
+0x2121	0x20086
+0x2125	0x21FE8
+0x2128	0x2010E
+0x2129	0x20627
+0x212D	0x2053C
+0x212E	0x20675
+0x212F	0x2F828
+0x2133	0x2193C
+0x2134	0x2F875
+0x2135	0x2F878
+0x213F	0x2F819
+0x2140	0x206A5
+0x2141	0x206AA
+0x2142	0x2090F
+0x2143	0x20A0E
+0x2146	0x20B9C
+0x2147	0x20B9B
+0x2148	0x2123C
+0x214A	0x21BC2
+0x214E	0x233B4
+0x2156	0x20065
+0x2158	0x201B2
+0x215C	0x20477
+0x215D	0x20542
+0x215F	0x20633
+0x2162	0x206AF
+0x2163	0x20836
+0x2168	0x20B22
+0x216E	0x211A3
+0x2174	0x21C25
+0x2175	0x21C24
+0x2177	0x22052
+0x2178	0x22189
+0x2179	0x224BF
+0x217D	0x233B5
+0x217E	0x2574C
+0x2222	0x28E14
+0x2223	0x28E12
+0x2225	0x200A3
+0x2226	0x200A2
+0x2229	0x201B6
+0x222B	0x201B5
+0x222C	0x201B4
+0x222F	0x201C2
+0x2230	0x201B8
+0x2232	0x20479
+0x2235	0x20508
+0x2237	0x2057A
+0x2238	0x205B6
+0x2239	0x206BD
+0x223A	0x206B7
+0x223B	0x206BC
+0x223D	0x206C4
+0x223E	0x206C9
+0x2243	0x20930
+0x2244	0x20983
+0x2245	0x20985
+0x2246	0x20A12
+0x2247	0x20A34
+0x2249	0x20AE4
+0x224A	0x20ADE
+0x224B	0x20B2A
+0x224D	0x20BAF
+0x224E	0x20BB4
+0x224F	0x20BB3
+0x2250	0x20BB1
+0x2254	0x215DE
+0x2257	0x216B8
+0x2258	0x216B0
+0x225A	0x219C2
+0x225E	0x21C2A
+0x2262	0x21FE9
+0x2264	0x22057
+0x2267	0x221B6
+0x2268	0x221D7
+0x2269	0x221DE
+0x226E	0x224C2
+0x226F	0x225AB
+0x2272	0x2298F
+0x2276	0x22A6D
+0x2277	0x22EB5
+0x227A	0x233C0
+0x227B	0x233BF
+0x227D	0x239B9
+0x227E	0x23B1C
+0x2323	0x23C80
+0x2324	0x24184
+0x2325	0x24185
+0x2328	0x24724
+0x232C	0x2634C
+0x232E	0x26AF6
+0x2331	0x28670
+0x2333	0x28675
+0x2334	0x28E17
+0x2338	0x201F1
+0x233A	0x201DA
+0x233C	0x205B9
+0x2341	0x206CE
+0x2342	0x206D2
+0x2343	0x206D0
+0x2345	0x20843
+0x2349	0x2084D
+0x234A	0x20934
+0x234C	0x209D9
+0x234E	0x20A18
+0x2350	0x20B38
+0x2352	0x20BD7
+0x2355	0x20BDC
+0x2356	0x20BCB
+0x2357	0x20BD6
+0x2358	0x20BD8
+0x235A	0x20BD1
+0x235B	0x2F83E
+0x235C	0x2F83C
+0x235D	0x20BD2
+0x2360	0x21259
+0x2363	0x215E5
+0x2364	0x215E6
+0x2366	0x215E8
+0x2368	0x216BD
+0x236B	0x216BE
+0x236C	0x21949
+0x236E	0x219CD
+0x2372	0x21B5E
+0x2373	0x21BD0
+0x2375	0x21D06
+0x237C	0x21D7C
+0x237D	0x21D71
+0x237E	0x21FEF
+0x2426	0x2218D
+0x2427	0x221B7
+0x242A	0x22333
+0x242B	0x2237F
+0x242D	0x225F2
+0x2434	0x22A2A
+0x2435	0x22A8B
+0x2437	0x22A83
+0x2438	0x22A8A
+0x243B	0x22A8E
+0x243D	0x22EB6
+0x2442	0x230D8
+0x2444	0x23156
+0x2445	0x233D2
+0x2447	0x2F8DB
+0x2449	0x233C2
+0x244A	0x23887
+0x244B	0x23881
+0x244C	0x239C2
+0x244D	0x239BC
+0x244E	0x23B23
+0x2450	0x23C93
+0x2453	0x2418D
+0x2454	0x2418E
+0x2457	0x2473B
+0x2458	0x2474D
+0x245A	0x24734
+0x245B	0x24731
+0x245C	0x248F2
+0x245D	0x248F0
+0x245F	0x24C15
+0x2460	0x24D28
+0x2463	0x24F25
+0x2464	0x250E7
+0x2466	0x250E9
+0x2467	0x25417
+0x246A	0x2626C
+0x246B	0x26280
+0x246C	0x2634B
+0x2471	0x268DE
+0x2472	0x268FB
+0x2474	0x26951
+0x2477	0x26B01
+0x2478	0x26B02
+0x247A	0x26B05
+0x247C	0x26B03
+0x247E	0x28451
+0x2524	0x28453
+0x2525	0x2867A
+0x2526	0x28678
+0x2527	0x28676
+0x2528	0x28679
+0x2529	0x2868F
+0x252A	0x2867C
+0x252C	0x28E1B
+0x252D	0x28E1C
+0x252F	0x23D92
+0x2532	0x2012E
+0x2533	0x2012C
+0x2535	0x2020C
+0x2537	0x2020B
+0x253A	0x20205
+0x253D	0x2F805
+0x2541	0x205C2
+0x2542	0x205C3
+0x2544	0x20648
+0x2546	0x20646
+0x2549	0x206EA
+0x254B	0x206EB
+0x254D	0x206EE
+0x2552	0x208D8
+0x2553	0x24C1E
+0x2554	0x209DF
+0x2555	0x209DE
+0x2558	0x20A4F
+0x255B	0x20C0D
+0x255C	0x20C08
+0x255E	0x20C09
+0x2561	0x20C12
+0x2562	0x20C65
+0x2567	0x21289
+0x256A	0x21284
+0x256B	0x2129E
+0x256C	0x2128B
+0x256F	0x21562
+0x2574	0x215F9
+0x2576	0x215F7
+0x2579	0x21606
+0x257A	0x216DD
+0x257C	0x216D9
+0x257D	0x216DF
+0x257E	0x216E2
+0x2624	0x200F1
+0x262B	0x21C3F
+0x262C	0x21C3E
+0x262D	0x21D0B
+0x2630	0x21D83
+0x2633	0x21D86
+0x2635	0x2207C
+0x2639	0x221F7
+0x263E	0x221FB
+0x263F	0x2233B
+0x2644	0x225F9
+0x2645	0x225CA
+0x2647	0x225FF
+0x264A	0x22609
+0x264B	0x22603
+0x2651	0x22610
+0x2652	0x2299A
+0x2653	0x2299F
+0x2657	0x22A87
+0x265A	0x22EB7
+0x265C	0x22F08
+0x265D	0x22EF9
+0x2660	0x22EF4
+0x2664	0x26657
+0x2666	0x233D6
+0x2668	0x2F8DE
+0x266B	0x233D4
+0x266E	0x23890
+0x266F	0x2388D
+0x2672	0x23960
+0x2673	0x239CE
+0x2674	0x239CF
+0x2677	0x239D1
+0x267C	0x23CCA
+0x2721	0x23CB7
+0x2723	0x23CB2
+0x2724	0x23CBB
+0x2725	0x23CB9
+0x2728	0x2419E
+0x272A	0x241B2
+0x272D	0x2456F
+0x272E	0x245AC
+0x2730	0x24623
+0x2735	0x2476C
+0x2737	0x24732
+0x2738	0x2475E
+0x273C	0x248FB
+0x273D	0x24B29
+0x273E	0x24BBD
+0x273F	0x24C1F
+0x2741	0x22341
+0x2742	0x24C1D
+0x2744	0x24D31
+0x2745	0x24D2F
+0x2747	0x25043
+0x2749	0x25041
+0x274B	0x250F5
+0x2750	0x250F2
+0x2754	0x2541E
+0x2755	0x25754
+0x2757	0x25756
+0x2758	0x25929
+0x2759	0x25927
+0x275A	0x25928
+0x275D	0x26279
+0x275E	0x2627E
+0x275F	0x264B6
+0x2760	0x264B7
+0x2768	0x2F981
+0x276B	0x2664D
+0x2770	0x26A09
+0x2771	0x26A08
+0x2774	0x26B1E
+0x2775	0x26B1A
+0x2776	0x26B23
+0x2777	0x26B15
+0x2778	0x26B19
+0x2779	0x26B16
+0x277C	0x26B14
+0x277D	0x26B18
+0x2822	0x2721F
+0x2823	0x275DD
+0x2824	0x275DF
+0x2825	0x28469
+0x2828	0x2846C
+0x282A	0x28693
+0x282C	0x28695
+0x282D	0x28694
+0x282E	0x28691
+0x282F	0x28697
+0x2830	0x28E30
+0x2834	0x2FA18
+0x2836	0x20231
+0x283B	0x20236
+0x2841	0x205C9
+0x2842	0x205CA
+0x2844	0x20718
+0x2845	0x20712
+0x2846	0x20719
+0x2847	0x20710
+0x2848	0x20716
+0x284A	0x2085F
+0x284C	0x208DF
+0x284D	0x20917
+0x284F	0x2093C
+0x2851	0x209EA
+0x2852	0x209E9
+0x2853	0x20A1C
+0x2854	0x20A58
+0x2855	0x20A64
+0x2856	0x20AF3
+0x2858	0x20C97
+0x285A	0x20C5A
+0x285B	0x20C59
+0x285D	0x20C8E
+0x285F	0x212BC
+0x2862	0x2160D
+0x2863	0x215FC
+0x2864	0x2160C
+0x2865	0x21707
+0x2866	0x2170A
+0x2868	0x21702
+0x286A	0x21726
+0x286B	0x21708
+0x286C	0x2171D
+0x286F	0x2194E
+0x2871	0x219ED
+0x2872	0x219EE
+0x2873	0x219EF
+0x2876	0x21C50
+0x2877	0x21C4C
+0x287A	0x21C4F
+0x287C	0x21DD4
+0x287E	0x21DB0
+0x2926	0x220A5
+0x2927	0x22209
+0x292F	0x223F3
+0x2930	0x223D7
+0x2933	0x224DC
+0x2938	0x2260B
+0x2942	0x2263A
+0x2943	0x2260D
+0x2944	0x22611
+0x2946	0x22620
+0x2947	0x22601
+0x2949	0x22637
+0x294A	0x2F8A3
+0x294C	0x229AA
+0x294F	0x22AE7
+0x2950	0x22AE8
+0x2953	0x22AF5
+0x2957	0x22B35
+0x2958	0x22AE6
+0x295A	0x22AF8
+0x295C	0x22AF1
+0x295E	0x22F14
+0x295F	0x22F15
+0x2960	0x22F09
+0x2966	0x2317B
+0x2968	0x2317E
+0x2969	0x23366
+0x296A	0x23367
+0x296B	0x2340A
+0x2975	0x2389C
+0x2976	0x23962
+0x2977	0x239E1
+0x2978	0x239DE
+0x2979	0x239DF
+0x297A	0x239E9
+0x297C	0x23CE4
+0x297D	0x23CF7
+0x2A22	0x23CEA
+0x2A23	0x23CF6
+0x2A24	0x23D12
+0x2A25	0x2F901
+0x2A29	0x241D9
+0x2A2B	0x2455F
+0x2A2D	0x24573
+0x2A30	0x2463F
+0x2A31	0x24778
+0x2A33	0x2477D
+0x2A36	0x24912
+0x2A3B	0x24B2F
+0x2A3E	0x24B30
+0x2A3F	0x24BDB
+0x2A42	0x24C29
+0x2A44	0x2F936
+0x2A45	0x24D40
+0x2A47	0x24D3D
+0x2A48	0x24D3E
+0x2A4B	0x24D38
+0x2A4D	0x24F48
+0x2A4F	0x24FD0
+0x2A5B	0x2510E
+0x2A5C	0x25109
+0x2A5E	0x25107
+0x2A60	0x2535F
+0x2A61	0x25360
+0x2A63	0x2542A
+0x2A65	0x25429
+0x2A68	0x2564D
+0x2A6D	0x2576C
+0x2A70	0x25767
+0x2A73	0x25939
+0x2A74	0x25934
+0x2A75	0x25A59
+0x2A78	0x26223
+0x2A7A	0x26282
+0x2A7C	0x26283
+0x2A7D	0x262A8
+0x2A7E	0x26355
+0x2B21	0x263F9
+0x2B22	0x263F8
+0x2B23	0x263FC
+0x2B24	0x263FA
+0x2B26	0x2F97A
+0x2B2B	0x26674
+0x2B2D	0x2666B
+0x2B2E	0x26671
+0x2B30	0x26676
+0x2B31	0x26A0E
+0x2B34	0x26A10
+0x2B35	0x26A0F
+0x2B37	0x26B38
+0x2B38	0x26B39
+0x2B39	0x26B3A
+0x2B3B	0x26B37
+0x2B3C	0x26B3E
+0x2B3F	0x2719C
+0x2B40	0x2722A
+0x2B41	0x2723A
+0x2B42	0x2722B
+0x2B43	0x27228
+0x2B44	0x275AA
+0x2B45	0x2760F
+0x2B47	0x27610
+0x2B48	0x277E6
+0x2B4A	0x27D25
+0x2B4B	0x27E8E
+0x2B4F	0x2848B
+0x2B51	0x2848C
+0x2B52	0x2849A
+0x2B55	0x286B3
+0x2B57	0x286B2
+0x2B5C	0x28E44
+0x2B5F	0x20158
+0x2B60	0x202A7
+0x2B63	0x20263
+0x2B66	0x2026A
+0x2B67	0x20265
+0x2B68	0x2026B
+0x2B6A	0x204ED
+0x2B6B	0x205D9
+0x2B6C	0x2073B
+0x2B6D	0x20732
+0x2B6F	0x20735
+0x2B70	0x20731
+0x2B71	0x2073E
+0x2B72	0x20743
+0x2B73	0x20736
+0x2B74	0x2086D
+0x2B76	0x208E4
+0x2B79	0x209F4
+0x2B7B	0x20A69
+0x2B7C	0x20A6B
+0x2C22	0x20CBF
+0x2C23	0x20CC3
+0x2C24	0x20CAE
+0x2C27	0x20CB1
+0x2C2A	0x20CBB
+0x2C2B	0x20CAF
+0x2C2C	0x20CB0
+0x2C30	0x212EF
+0x2C32	0x212ED
+0x2C34	0x212F0
+0x2C35	0x21593
+0x2C36	0x21634
+0x2C37	0x2162B
+0x2C43	0x21A04
+0x2C44	0x21A03
+0x2C45	0x21A02
+0x2C47	0x21A05
+0x2C4A	0x21A00
+0x2C4B	0x21B74
+0x2C4F	0x21C65
+0x2C50	0x21C63
+0x2C52	0x21DD7
+0x2C56	0x21DE8
+0x2C58	0x21DDB
+0x2C59	0x21DD8
+0x2C5D	0x21E09
+0x2C62	0x21DE5
+0x2C63	0x21DE7
+0x2C65	0x2203F
+0x2C67	0x220C0
+0x2C69	0x220B9
+0x2C6A	0x220BA
+0x2C6E	0x22220
+0x2C6F	0x2234F
+0x2C73	0x22491
+0x2C74	0x22490
+0x2C75	0x224EE
+0x2C76	0x224F3
+0x2C77	0x224EC
+0x2C78	0x224F1
+0x2C79	0x224EB
+0x2C7A	0x224F2
+0x2C7B	0x224F4
+0x2C7C	0x224ED
+0x2C7D	0x22641
+0x2C7E	0x22648
+0x2D21	0x22645
+0x2D26	0x2267F
+0x2D27	0x2268B
+0x2D29	0x2263B
+0x2D2A	0x2264E
+0x2D2E	0x2267C
+0x2D34	0x22AF0
+0x2D35	0x22B36
+0x2D36	0x22B3F
+0x2D37	0x22B43
+0x2D38	0x22B31
+0x2D39	0x22B34
+0x2D3A	0x22B46
+0x2D3D	0x22B2F
+0x2D3E	0x22EC3
+0x2D41	0x22F36
+0x2D45	0x22F21
+0x2D46	0x2F8C8
+0x2D48	0x23073
+0x2D4A	0x230E6
+0x2D50	0x2343F
+0x2D53	0x2346B
+0x2D5A	0x23471
+0x2D5C	0x2F8E2
+0x2D5F	0x238B0
+0x2D63	0x239F3
+0x2D65	0x2F8F5
+0x2D68	0x23B61
+0x2D69	0x23B5F
+0x2D6D	0x23D28
+0x2D6E	0x23D1E
+0x2D6F	0x23D29
+0x2D70	0x2F902
+0x2D71	0x23CEB
+0x2D72	0x23D66
+0x2D74	0x241F6
+0x2D77	0x24560
+0x2D78	0x24577
+0x2D79	0x245BB
+0x2D7B	0x245BC
+0x2E23	0x247A2
+0x2E24	0x247B2
+0x2E25	0x2479E
+0x2E28	0x2493A
+0x2E29	0x24938
+0x2E2E	0x24C4D
+0x2E30	0x24C5E
+0x2E32	0x24D17
+0x2E3D	0x24D64
+0x2E3E	0x24D67
+0x2E42	0x24F59
+0x2E44	0x24FDA
+0x2E48	0x25051
+0x2E4A	0x25055
+0x2E4B	0x2513B
+0x2E4C	0x25134
+0x2E4E	0x25137
+0x2E50	0x25131
+0x2E53	0x2513F
+0x2E54	0x25159
+0x2E56	0x25361
+0x2E59	0x25458
+0x2E5A	0x25462
+0x2E5B	0x25450
+0x2E5D	0x25451
+0x2E60	0x25446
+0x2E63	0x2562D
+0x2E66	0x25948
+0x2E67	0x25951
+0x2E68	0x2594A
+0x2E69	0x2594F
+0x2E6A	0x25950
+0x2E6B	0x25949
+0x2E6C	0x25A63
+0x2E6E	0x25A66
+0x2E6F	0x25A60
+0x2E74	0x25AF1
+0x2E76	0x25B07
+0x2E79	0x25F9B
+0x2E7A	0x25FA3
+0x2E7B	0x25F9D
+0x2F22	0x25FA9
+0x2F23	0x25FA7
+0x2F24	0x25FA4
+0x2F26	0x25FBA
+0x2F27	0x221C1
+0x2F28	0x26226
+0x2F2B	0x26294
+0x2F2C	0x26293
+0x2F31	0x26407
+0x2F32	0x2640D
+0x2F33	0x26402
+0x2F34	0x2640C
+0x2F35	0x26409
+0x2F36	0x26408
+0x2F37	0x26413
+0x2F39	0x264D2
+0x2F3B	0x2653E
+0x2F3C	0x2653C
+0x2F3D	0x26667
+0x2F3E	0x2669E
+0x2F40	0x266AD
+0x2F42	0x266D9
+0x2F43	0x26642
+0x2F44	0x266A3
+0x2F45	0x266A0
+0x2F48	0x2667C
+0x2F49	0x26904
+0x2F4B	0x26958
+0x2F4C	0x26960
+0x2F4D	0x269C9
+0x2F4E	0x269C8
+0x2F51	0x26A1C
+0x2F52	0x26A1A
+0x2F54	0x26B74
+0x2F56	0x26B6E
+0x2F57	0x26B6F
+0x2F58	0x26B79
+0x2F5B	0x26B77
+0x2F60	0x26B7C
+0x2F62	0x26B70
+0x2F65	0x26B7A
+0x2F66	0x26B82
+0x2F6A	0x27244
+0x2F6C	0x27243
+0x2F6E	0x27245
+0x2F70	0x27625
+0x2F71	0x2761F
+0x2F74	0x277E8
+0x2F77	0x27809
+0x2F78	0x278B7
+0x2F79	0x278B9
+0x2F7A	0x27964
+0x2F7B	0x27963
+0x3021	0x27962
+0x3022	0x27965
+0x3024	0x27BAC
+0x3026	0x27D2A
+0x3029	0x27E96
+0x302B	0x27FC2
+0x302C	0x2F9DE
+0x3031	0x284AA
+0x3032	0x284B0
+0x3035	0x286D4
+0x3036	0x286CD
+0x3037	0x286D6
+0x3039	0x287F0
+0x3043	0x29D4B
+0x3044	0x20162
+0x3046	0x202B7
+0x3048	0x202AC
+0x3049	0x202AB
+0x304B	0x202C1
+0x304E	0x205E8
+0x304F	0x20769
+0x3050	0x2075D
+0x3051	0x2075F
+0x3055	0x20764
+0x3056	0x20762
+0x305B	0x208F9
+0x305D	0x208EE
+0x3061	0x209AB
+0x3062	0x209AC
+0x3063	0x209AA
+0x3066	0x20A86
+0x3067	0x20A7A
+0x3069	0x20D28
+0x306E	0x20D31
+0x3075	0x20D2D
+0x3076	0x2F843
+0x3078	0x20D2B
+0x3079	0x20D32
+0x307C	0x21329
+0x307D	0x21326
+0x307E	0x21353
+0x3122	0x21333
+0x3123	0x21334
+0x3124	0x2159D
+0x3127	0x21641
+0x312A	0x21791
+0x312B	0x21769
+0x312D	0x21A22
+0x312F	0x21A34
+0x3130	0x2F86D
+0x3131	0x21B2E
+0x3134	0x21BF4
+0x3136	0x21E28
+0x3138	0x21E1C
+0x313A	0x21E11
+0x313B	0x21E24
+0x313C	0x21E15
+0x313E	0x21E16
+0x313F	0x21E54
+0x3140	0x21E23
+0x3141	0x21FFF
+0x3143	0x220CF
+0x3144	0x220D0
+0x3146	0x220CE
+0x314A	0x221C7
+0x314B	0x2225C
+0x314D	0x22236
+0x3150	0x22243
+0x3155	0x2252A
+0x3156	0x22501
+0x3158	0x2250B
+0x3159	0x2250F
+0x315F	0x226DF
+0x3161	0x226D2
+0x3165	0x226CD
+0x3169	0x226DB
+0x316D	0x226CF
+0x316F	0x229C0
+0x3172	0x22B81
+0x3173	0x22B82
+0x3174	0x22B8A
+0x3175	0x22BA8
+0x3176	0x22B8C
+0x317D	0x22B8E
+0x3222	0x22B8B
+0x3224	0x22B96
+0x3226	0x22BCC
+0x3229	0x22F4F
+0x322A	0x22F4A
+0x322D	0x22F4B
+0x322E	0x22F3D
+0x3230	0x22F44
+0x3231	0x22F49
+0x3232	0x2309E
+0x3233	0x230F3
+0x3235	0x230F5
+0x3238	0x231B3
+0x323C	0x231E5
+0x323D	0x231B6
+0x323E	0x2F8D8
+0x3240	0x23486
+0x3244	0x234B6
+0x3245	0x23485
+0x3247	0x234AB
+0x324B	0x23A0D
+0x324C	0x23A8B
+0x324D	0x23A8C
+0x3256	0x23B72
+0x3259	0x23D8F
+0x325B	0x23D79
+0x325D	0x23D77
+0x325F	0x23D90
+0x3260	0x23D88
+0x3261	0x23D80
+0x3262	0x23D9E
+0x3265	0x23D82
+0x3266	0x23D34
+0x3267	0x23D89
+0x3269	0x23D85
+0x326A	0x23D7E
+0x326B	0x23D7A
+0x326C	0x23DA6
+0x326E	0x23DB5
+0x326F	0x241F4
+0x3273	0x24229
+0x3274	0x24226
+0x3275	0x2422A
+0x3278	0x2457E
+0x327B	0x2465B
+0x327C	0x24661
+0x327D	0x24660
+0x3321	0x2479B
+0x3324	0x247C3
+0x3326	0x247CD
+0x3331	0x24954
+0x3332	0x24959
+0x3336	0x24AF5
+0x333D	0x24C69
+0x333E	0x24C65
+0x3341	0x24D7C
+0x3344	0x24D80
+0x3346	0x24F65
+0x3349	0x24FDF
+0x334A	0x25060
+0x334C	0x2505E
+0x3353	0x2518F
+0x3354	0x25161
+0x3355	0x2515A
+0x3358	0x25367
+0x335C	0x253BB
+0x3368	0x2579B
+0x336C	0x257A9
+0x336E	0x25966
+0x3373	0x25A72
+0x3374	0x25A76
+0x3375	0x25B14
+0x3379	0x25B0F
+0x337E	0x25E41
+0x3421	0x25E46
+0x3423	0x25E4B
+0x3424	0x25E43
+0x3428	0x25FC6
+0x342A	0x25FC7
+0x342C	0x25FCE
+0x342F	0x25FC9
+0x3431	0x25FCB
+0x3432	0x25FC5
+0x3439	0x26369
+0x343F	0x2641E
+0x3440	0x264BA
+0x3442	0x26552
+0x3443	0x26551
+0x3444	0x26553
+0x3445	0x2669F
+0x3446	0x266DB
+0x3449	0x266E3
+0x344E	0x266D7
+0x344F	0x266E9
+0x3454	0x266DE
+0x3455	0x266DC
+0x3456	0x2693C
+0x3457	0x2F98B
+0x3459	0x26A22
+0x345A	0x26A32
+0x345B	0x26A23
+0x345F	0x26BD4
+0x3460	0x26BC8
+0x3461	0x26BBC
+0x3464	0x26BCD
+0x3468	0x26BBE
+0x346A	0x26C40
+0x346B	0x26BD6
+0x346E	0x26BBD
+0x3470	0x26BBA
+0x3472	0x26BC0
+0x3473	0x2F99B
+0x3474	0x2F99D
+0x3475	0x26BC1
+0x3476	0x271A6
+0x3477	0x271A5
+0x3478	0x271A8
+0x347D	0x2725F
+0x347E	0x27270
+0x3521	0x2726A
+0x3522	0x27265
+0x3523	0x27267
+0x3524	0x2726F
+0x3525	0x27287
+0x3528	0x2763D
+0x3529	0x27643
+0x352B	0x27640
+0x3532	0x27818
+0x3536	0x27819
+0x3537	0x278C1
+0x353B	0x278BC
+0x353C	0x278C8
+0x353E	0x27971
+0x3540	0x2796E
+0x3542	0x27978
+0x3545	0x2F9CD
+0x3546	0x2797A
+0x3547	0x27BB1
+0x3548	0x27BAF
+0x3549	0x27BB0
+0x354E	0x27CA8
+0x354F	0x27CA6
+0x3552	0x27D48
+0x3553	0x27D45
+0x3557	0x27EA0
+0x3558	0x27EA4
+0x355A	0x27FD4
+0x355F	0x27FD2
+0x3560	0x28222
+0x3564	0x282B7
+0x3565	0x282CC
+0x3567	0x284E6
+0x356A	0x284C8
+0x356D	0x286F4
+0x356F	0x286ED
+0x3571	0x2867E
+0x3572	0x2F9E3
+0x3576	0x287F9
+0x3577	0x287FD
+0x3579	0x28807
+0x357E	0x28E78
+0x3621	0x28E7A
+0x3622	0x28E79
+0x3623	0x28F8A
+0x3625	0x2907B
+0x3626	0x291D5
+0x3627	0x291E9
+0x3629	0x291EB
+0x362F	0x2016C
+0x3635	0x202FA
+0x363B	0x20318
+0x363E	0x205F6
+0x3640	0x2078A
+0x3641	0x20789
+0x3643	0x2077F
+0x3644	0x20788
+0x3646	0x20783
+0x3647	0x20784
+0x3648	0x20798
+0x3649	0x20763
+0x364A	0x20787
+0x364C	0x2F827
+0x364E	0x208F5
+0x364F	0x20950
+0x3652	0x20A87
+0x3653	0x20A8A
+0x3654	0x20B65
+0x3655	0x20DB7
+0x3656	0x20DC1
+0x3657	0x20DC7
+0x365A	0x20DC5
+0x365B	0x20DCB
+0x365D	0x20DD1
+0x3661	0x20DB8
+0x3662	0x20DCA
+0x3664	0x20DDE
+0x3666	0x20DCE
+0x366A	0x21368
+0x366C	0x2136B
+0x3670	0x2136A
+0x3672	0x21366
+0x3673	0x21377
+0x3674	0x21396
+0x3675	0x2136E
+0x3676	0x2F856
+0x3678	0x21657
+0x367A	0x21656
+0x367B	0x2179C
+0x367C	0x2179E
+0x3721	0x217A1
+0x3723	0x21A42
+0x3725	0x21A46
+0x3726	0x21A3E
+0x3727	0x21B33
+0x372A	0x21BFA
+0x372C	0x21C97
+0x372D	0x21C9B
+0x372E	0x21CAA
+0x3730	0x21E73
+0x3731	0x21E7C
+0x3733	0x21E86
+0x3737	0x220F3
+0x3738	0x220F0
+0x373E	0x220EC
+0x373F	0x222AF
+0x3742	0x22264
+0x3743	0x22268
+0x3744	0x2235A
+0x3746	0x2251F
+0x3747	0x22525
+0x374B	0x226C6
+0x374C	0x226D6
+0x374D	0x226C3
+0x374F	0x2272C
+0x3751	0x2272E
+0x3752	0x2275E
+0x3753	0x22733
+0x3757	0x2272D
+0x3758	0x22746
+0x375A	0x226C1
+0x375B	0x2273A
+0x375C	0x229CC
+0x375D	0x22B9D
+0x375E	0x22B83
+0x375F	0x22BF6
+0x3763	0x22BF8
+0x3766	0x22BFE
+0x3767	0x22BF3
+0x3769	0x22BEB
+0x376A	0x22BFA
+0x376C	0x22C07
+0x376D	0x22BFC
+0x3772	0x22F72
+0x3773	0x22F73
+0x3774	0x22F74
+0x377A	0x22F5F
+0x377B	0x22F60
+0x377C	0x230AA
+0x377D	0x23134
+0x3821	0x231B4
+0x3823	0x231F0
+0x3826	0x2320D
+0x3827	0x231F3
+0x3828	0x2320F
+0x382B	0x234C9
+0x382E	0x234C5
+0x3830	0x234D7
+0x3831	0x234CC
+0x3833	0x234E7
+0x3836	0x234C1
+0x3838	0x234E8
+0x383A	0x238CB
+0x383D	0x238C8
+0x383E	0x2397A
+0x3840	0x23979
+0x3841	0x2397E
+0x3843	0x23A1B
+0x3847	0x23A1F
+0x3848	0x23A19
+0x384D	0x23B89
+0x3850	0x23B8B
+0x3853	0x23E09
+0x3854	0x23DFE
+0x3855	0x23E00
+0x3858	0x23E0B
+0x385D	0x23E4A
+0x3863	0x24279
+0x3866	0x2426C
+0x3867	0x24299
+0x3868	0x2F91B
+0x3869	0x24262
+0x386A	0x24514
+0x386D	0x245C8
+0x386E	0x245D7
+0x386F	0x2460C
+0x3871	0x24670
+0x3874	0x24671
+0x3875	0x247DF
+0x3876	0x247E4
+0x3878	0x247E7
+0x387C	0x24990
+0x3922	0x24B4C
+0x3927	0x24B4F
+0x3929	0x24C7D
+0x392A	0x24C7E
+0x392B	0x24C7C
+0x392D	0x24C8D
+0x392E	0x24D19
+0x3931	0x24DC0
+0x3937	0x24DB6
+0x3939	0x24DA8
+0x393B	0x24FEB
+0x393C	0x24FE7
+0x393D	0x2506F
+0x393E	0x251C7
+0x3940	0x2519F
+0x3944	0x251C4
+0x394E	0x2519B
+0x394F	0x25197
+0x3950	0x251C5
+0x3951	0x2536B
+0x3952	0x253CE
+0x3955	0x254B1
+0x3956	0x254AE
+0x3957	0x254B0
+0x395B	0x2573E
+0x395C	0x257B5
+0x395D	0x257BA
+0x395F	0x257B2
+0x3960	0x257B4
+0x3966	0x25977
+0x3968	0x25986
+0x3969	0x2597B
+0x396B	0x25A7E
+0x396C	0x25B2E
+0x396E	0x25B2F
+0x3970	0x25B37
+0x3973	0x25B32
+0x3977	0x25B36
+0x3978	0x25B39
+0x3979	0x25B35
+0x397A	0x25E5C
+0x397E	0x25E7B
+0x3A21	0x25E61
+0x3A22	0x25FEE
+0x3A23	0x25FEB
+0x3A24	0x25FEF
+0x3A25	0x26020
+0x3A29	0x26230
+0x3A2C	0x262BE
+0x3A2E	0x26367
+0x3A2F	0x2637C
+0x3A32	0x26424
+0x3A36	0x26429
+0x3A37	0x264EF
+0x3A3C	0x2670D
+0x3A46	0x26764
+0x3A48	0x26715
+0x3A50	0x26A35
+0x3A51	0x26A36
+0x3A52	0x26A34
+0x3A53	0x26A37
+0x3A54	0x26C47
+0x3A55	0x26C2B
+0x3A57	0x26C41
+0x3A58	0x26C43
+0x3A5A	0x26C42
+0x3A5D	0x26C32
+0x3A62	0x26C44
+0x3A63	0x26C4A
+0x3A66	0x2F9A0
+0x3A69	0x26C54
+0x3A6A	0x26C6E
+0x3A6B	0x26C52
+0x3A73	0x27292
+0x3A75	0x2F9B8
+0x3A77	0x272BF
+0x3A7C	0x27641
+0x3A7D	0x27669
+0x3A7E	0x27665
+0x3B24	0x27822
+0x3B25	0x2781D
+0x3B26	0x278D2
+0x3B27	0x278DA
+0x3B28	0x278DB
+0x3B2D	0x279A4
+0x3B2E	0x2799E
+0x3B32	0x2799D
+0x3B37	0x279AD
+0x3B38	0x279A6
+0x3B39	0x279A7
+0x3B3A	0x27BB3
+0x3B3B	0x27BE0
+0x3B3C	0x27C35
+0x3B3D	0x27C37
+0x3B40	0x27D4A
+0x3B44	0x27E5E
+0x3B46	0x27EC0
+0x3B4E	0x27FF9
+0x3B56	0x284F0
+0x3B58	0x284F3
+0x3B59	0x2851B
+0x3B5A	0x284F2
+0x3B5B	0x284FB
+0x3B5C	0x2871C
+0x3B5D	0x28713
+0x3B5F	0x2870F
+0x3B61	0x28816
+0x3B62	0x28811
+0x3B63	0x28812
+0x3B65	0x2880E
+0x3B68	0x28C67
+0x3B69	0x28CF2
+0x3B6A	0x28CDA
+0x3B6C	0x28CDC
+0x3B6E	0x28F94
+0x3B6F	0x28F9B
+0x3B70	0x28F92
+0x3B71	0x28F9A
+0x3B72	0x29088
+0x3B73	0x29086
+0x3B75	0x291EF
+0x3B78	0x2925E
+0x3B7A	0x29458
+0x3B7C	0x29456
+0x3B7D	0x29454
+0x3C21	0x2959B
+0x3C22	0x29696
+0x3C23	0x296A4
+0x3C26	0x2969A
+0x3C27	0x29A12
+0x3C2B	0x2036B
+0x3C2E	0x20337
+0x3C2F	0x2033C
+0x3C30	0x2F80A
+0x3C31	0x204F7
+0x3C33	0x20566
+0x3C35	0x207A9
+0x3C36	0x207AE
+0x3C37	0x207AD
+0x3C38	0x207C8
+0x3C39	0x207A5
+0x3C3A	0x207B0
+0x3C3B	0x20895
+0x3C3D	0x20925
+0x3C3F	0x20A99
+0x3C41	0x20B74
+0x3C42	0x20B70
+0x3C43	0x20B6F
+0x3C44	0x20E41
+0x3C45	0x20E54
+0x3C48	0x20E40
+0x3C49	0x20E38
+0x3C4D	0x20E52
+0x3C4E	0x20E3A
+0x3C4F	0x20E57
+0x3C50	0x2F84A
+0x3C51	0x20E59
+0x3C54	0x213B4
+0x3C55	0x213C0
+0x3C5A	0x21375
+0x3C5D	0x21660
+0x3C5E	0x21647
+0x3C60	0x217F0
+0x3C62	0x217EF
+0x3C65	0x217EC
+0x3C66	0x21983
+0x3C68	0x21984
+0x3C69	0x2198F
+0x3C6B	0x21A61
+0x3C6D	0x21A69
+0x3C70	0x21A62
+0x3C7A	0x21EAE
+0x3C7D	0x21EB2
+0x3D22	0x2210B
+0x3D24	0x22110
+0x3D25	0x2210D
+0x3D2B	0x2227F
+0x3D2C	0x22281
+0x3D31	0x2240B
+0x3D32	0x2254E
+0x3D35	0x227EA
+0x3D36	0x22745
+0x3D3F	0x22728
+0x3D40	0x2275D
+0x3D41	0x229DC
+0x3D44	0x229D4
+0x3D46	0x22C64
+0x3D47	0x22C68
+0x3D49	0x22C62
+0x3D4B	0x22C61
+0x3D4D	0x22C66
+0x3D51	0x22BF2
+0x3D52	0x22C69
+0x3D53	0x22C67
+0x3D55	0x22F9A
+0x3D56	0x22F9B
+0x3D57	0x22F85
+0x3D58	0x22F9C
+0x3D5A	0x22FA4
+0x3D5E	0x22F99
+0x3D5F	0x22F86
+0x3D60	0x22F90
+0x3D61	0x23081
+0x3D62	0x230AE
+0x3D66	0x23138
+0x3D6A	0x2353B
+0x3D70	0x2354C
+0x3D73	0x23547
+0x3D74	0x23535
+0x3D77	0x23533
+0x3D79	0x23582
+0x3D7A	0x23540
+0x3E25	0x23A36
+0x3E26	0x23B0E
+0x3E2A	0x23BAD
+0x3E2B	0x23BAA
+0x3E2C	0x23E17
+0x3E2E	0x23E67
+0x3E31	0x23E72
+0x3E33	0x2F90A
+0x3E34	0x23E61
+0x3E35	0x23EB0
+0x3E3A	0x23E6E
+0x3E3B	0x23E64
+0x3E3D	0x23E8C
+0x3E3E	0x23E66
+0x3E40	0x23E6B
+0x3E41	0x23E5F
+0x3E42	0x23E74
+0x3E43	0x23E65
+0x3E44	0x242BB
+0x3E45	0x242BE
+0x3E47	0x242B9
+0x3E4A	0x242EF
+0x3E4D	0x245DA
+0x3E50	0x24690
+0x3E51	0x247E9
+0x3E55	0x24811
+0x3E56	0x2480D
+0x3E57	0x247ED
+0x3E58	0x24821
+0x3E5A	0x24981
+0x3E5B	0x249B1
+0x3E5C	0x24B01
+0x3E5E	0x24B5E
+0x3E5F	0x24B62
+0x3E64	0x24B5B
+0x3E66	0x24C96
+0x3E67	0x24C93
+0x3E6A	0x24C92
+0x3E6C	0x2F939
+0x3E70	0x24DC4
+0x3E71	0x24DC7
+0x3E72	0x24DC3
+0x3E75	0x24DC8
+0x3E79	0x24DCA
+0x3E7B	0x24DC5
+0x3E7C	0x24DCF
+0x3E7D	0x24DDC
+0x3E7E	0x24F7C
+0x3F21	0x25001
+0x3F23	0x251D3
+0x3F24	0x251DC
+0x3F28	0x251D4
+0x3F2A	0x251CC
+0x3F2E	0x251D6
+0x3F2F	0x251DB
+0x3F31	0x251D5
+0x3F32	0x253D9
+0x3F34	0x253DD
+0x3F35	0x253DC
+0x3F36	0x253E0
+0x3F37	0x254CC
+0x3F41	0x254D2
+0x3F43	0x254D3
+0x3F48	0x2568D
+0x3F4E	0x257D8
+0x3F51	0x257BC
+0x3F56	0x25A8A
+0x3F58	0x25A8B
+0x3F59	0x25A8D
+0x3F5C	0x25B53
+0x3F5F	0x25B59
+0x3F64	0x25B56
+0x3F65	0x25B57
+0x3F68	0x25E73
+0x3F69	0x2601B
+0x3F6B	0x26021
+0x3F6C	0x26016
+0x3F6D	0x26018
+0x3F70	0x26044
+0x3F72	0x26026
+0x3F74	0x26236
+0x3F79	0x2643A
+0x3F7B	0x264F4
+0x3F7E	0x26762
+0x4021	0x2675B
+0x4022	0x2676A
+0x4024	0x26768
+0x402B	0x26781
+0x4031	0x26CE7
+0x4033	0x26CE6
+0x4034	0x26CD1
+0x4035	0x26D11
+0x4037	0x26CD0
+0x4038	0x26CD9
+0x4039	0x26D0A
+0x403B	0x26CDA
+0x403C	0x26CDD
+0x403D	0x26CC8
+0x403E	0x26CE2
+0x403F	0x26CE9
+0x4040	0x26CCB
+0x4042	0x26CCC
+0x4043	0x26CC1
+0x4045	0x26CDE
+0x404A	0x26D51
+0x404B	0x26D12
+0x404D	0x26CE0
+0x404E	0x26D2B
+0x404F	0x2F9B4
+0x4050	0x272D8
+0x4051	0x272D1
+0x4053	0x272D2
+0x4054	0x272CD
+0x4058	0x2733D
+0x405A	0x272CA
+0x405C	0x272CB
+0x405E	0x272D7
+0x405F	0x275F4
+0x4063	0x27687
+0x4064	0x2768B
+0x4065	0x27683
+0x4068	0x279C5
+0x4069	0x279D2
+0x406A	0x279C6
+0x406B	0x279D3
+0x406F	0x279F0
+0x4070	0x279CD
+0x4071	0x279CC
+0x4072	0x279DC
+0x4073	0x279D6
+0x4075	0x27BE6
+0x4076	0x27C41
+0x4077	0x27C3F
+0x4079	0x27CC5
+0x407A	0x27CC0
+0x407B	0x27CC6
+0x407C	0x27CBE
+0x407D	0x27CBF
+0x4122	0x27D63
+0x4123	0x27ED3
+0x4124	0x27EDA
+0x4125	0x27ED5
+0x412B	0x282EE
+0x412D	0x282FC
+0x412E	0x28414
+0x4130	0x28523
+0x4131	0x28522
+0x4132	0x28530
+0x4133	0x286B5
+0x4135	0x28738
+0x4137	0x2873F
+0x4144	0x28968
+0x4145	0x28967
+0x4147	0x28965
+0x414A	0x28C75
+0x414B	0x28CF7
+0x414C	0x28CF3
+0x414D	0x28CF6
+0x414F	0x28D00
+0x4151	0x28CFF
+0x4152	0x28CF5
+0x4158	0x29092
+0x4159	0x29206
+0x415B	0x29207
+0x415C	0x2926B
+0x415E	0x2926C
+0x4160	0x29393
+0x4162	0x29394
+0x4166	0x29462
+0x4167	0x29463
+0x4169	0x2945F
+0x416A	0x29464
+0x416B	0x2945B
+0x416C	0x29459
+0x416F	0x295A4
+0x4170	0x295AC
+0x4173	0x296B5
+0x4176	0x296AE
+0x4178	0x296C5
+0x417C	0x2983B
+0x4223	0x29ABF
+0x4224	0x29C2B
+0x4225	0x29C84
+0x4226	0x29C80
+0x4227	0x29D4D
+0x4228	0x29D4F
+0x422A	0x29D4C
+0x422B	0x29F92
+0x4230	0x203AE
+0x4231	0x20379
+0x4234	0x20371
+0x4236	0x203B3
+0x4238	0x2032C
+0x4239	0x20377
+0x423A	0x2052F
+0x423B	0x207C3
+0x423D	0x207CD
+0x4240	0x207C9
+0x4244	0x207CE
+0x4245	0x208A5
+0x4246	0x208A0
+0x4247	0x208FE
+0x4248	0x20959
+0x4249	0x20A9A
+0x424C	0x20EE4
+0x424D	0x20ED7
+0x424E	0x20EDC
+0x4250	0x20EE7
+0x4254	0x20EE5
+0x425A	0x21414
+0x425C	0x213F1
+0x4261	0x215B6
+0x4262	0x2166E
+0x4263	0x2166C
+0x4264	0x21681
+0x4265	0x21842
+0x426A	0x2181A
+0x426E	0x21827
+0x426F	0x21825
+0x4270	0x21817
+0x4271	0x2181C
+0x4272	0x2183D
+0x4273	0x21820
+0x4276	0x21A81
+0x427A	0x21C09
+0x427B	0x21CC6
+0x427C	0x21CC4
+0x427E	0x21CC5
+0x4323	0x21EEF
+0x4325	0x21EDF
+0x4326	0x21EDE
+0x4327	0x21EEE
+0x4328	0x21EF5
+0x4329	0x21EEC
+0x432B	0x21EDD
+0x4334	0x22122
+0x4337	0x22297
+0x4338	0x22295
+0x433C	0x224A9
+0x433E	0x22553
+0x4340	0x22556
+0x4341	0x22555
+0x4344	0x227E3
+0x4345	0x227E2
+0x434F	0x227A9
+0x4351	0x2F8AB
+0x4352	0x22833
+0x4353	0x2280A
+0x4355	0x22A59
+0x4357	0x22CBC
+0x4359	0x22CC4
+0x435A	0x22CC7
+0x435B	0x22CC6
+0x435F	0x22CB8
+0x4360	0x22CDA
+0x4362	0x22CB7
+0x4363	0x22CC0
+0x4365	0x22CCD
+0x4367	0x22FBC
+0x4368	0x22FAB
+0x436A	0x23086
+0x436C	0x2325A
+0x4370	0x23343
+0x4372	0x235AC
+0x4376	0x235BE
+0x437B	0x235AB
+0x4426	0x21B3E
+0x4429	0x238F9
+0x442B	0x238F3
+0x442C	0x238F7
+0x442E	0x23A45
+0x442F	0x23A48
+0x4434	0x23A44
+0x4436	0x23AAF
+0x4437	0x23AB1
+0x443B	0x23BCF
+0x443D	0x23BCB
+0x443E	0x23BCD
+0x4440	0x23C50
+0x4441	0x23EEC
+0x4442	0x23F1A
+0x4445	0x23ED8
+0x4447	0x23ED0
+0x4448	0x23ED1
+0x444B	0x23E7B
+0x444C	0x23ED2
+0x444E	0x23ED4
+0x444F	0x23EE7
+0x4450	0x23EDF
+0x4451	0x23EDE
+0x4453	0x23ED9
+0x4454	0x23ECF
+0x4455	0x2430D
+0x445D	0x24338
+0x4461	0x246A9
+0x446B	0x2483E
+0x446C	0x24846
+0x446D	0x249ED
+0x446E	0x2F930
+0x4472	0x24B6C
+0x447A	0x24CAC
+0x447D	0x24DC9
+0x4522	0x24E12
+0x4525	0x24DFD
+0x4526	0x24E01
+0x4527	0x24E11
+0x4529	0x24E89
+0x452A	0x24E05
+0x452B	0x24DFE
+0x452C	0x24E0B
+0x452D	0x24E20
+0x452E	0x24E04
+0x452F	0x24F88
+0x4531	0x25002
+0x4533	0x25003
+0x453A	0x25229
+0x453B	0x2523B
+0x453E	0x25206
+0x4545	0x25203
+0x4547	0x25378
+0x4548	0x25379
+0x4549	0x2537D
+0x454B	0x2537F
+0x4550	0x25532
+0x4552	0x25500
+0x4554	0x25522
+0x4556	0x256A9
+0x455C	0x25804
+0x455F	0x2F959
+0x4561	0x259B8
+0x4562	0x25A9B
+0x4567	0x25B92
+0x456C	0x25B8F
+0x456F	0x25B98
+0x4571	0x25BAE
+0x4573	0x25E9D
+0x4576	0x26049
+0x4577	0x26050
+0x4578	0x26046
+0x457A	0x2604E
+0x457D	0x26055
+0x4622	0x26064
+0x4624	0x26238
+0x4631	0x264FE
+0x463A	0x267A6
+0x4643	0x2679C
+0x4644	0x26799
+0x4648	0x267B5
+0x4649	0x267A3
+0x464A	0x267A0
+0x464B	0x267A7
+0x464C	0x2679B
+0x464D	0x269DF
+0x464E	0x269E1
+0x4652	0x26A4D
+0x4654	0x26DF3
+0x4655	0x26D6F
+0x4656	0x26D69
+0x4659	0x26D6B
+0x465A	0x26D78
+0x465B	0x26D87
+0x465D	0x26D85
+0x465E	0x26D82
+0x465F	0x26D90
+0x4662	0x26D80
+0x4663	0x26D67
+0x4666	0x26D61
+0x4668	0x26D93
+0x466A	0x26DF2
+0x466B	0x26D86
+0x466E	0x271CD
+0x466F	0x271C4
+0x4674	0x2730F
+0x4677	0x2730D
+0x467A	0x27373
+0x467C	0x2F9BA
+0x467D	0x2730A
+0x4721	0x27308
+0x4722	0x27313
+0x4724	0x275F8
+0x4728	0x276AB
+0x4729	0x276A8
+0x472C	0x276A5
+0x472F	0x276C3
+0x4730	0x276A4
+0x4732	0x276D4
+0x4733	0x276BA
+0x4734	0x277F1
+0x4737	0x2783F
+0x4739	0x278EA
+0x473B	0x279F7
+0x473E	0x279FA
+0x473F	0x279F5
+0x4741	0x279FE
+0x4744	0x27A00
+0x4747	0x27A02
+0x4748	0x279FB
+0x4749	0x27A07
+0x474B	0x27A1A
+0x474D	0x27BB8
+0x4750	0x27BE9
+0x4751	0x27BEB
+0x4752	0x27C50
+0x4753	0x27C4F
+0x4755	0x27D86
+0x4757	0x27D8E
+0x475C	0x27EF0
+0x475D	0x27EFB
+0x4760	0x28042
+0x4763	0x28085
+0x4768	0x28305
+0x476F	0x2874B
+0x4772	0x28763
+0x477A	0x28999
+0x477C	0x28C81
+0x477D	0x28D17
+0x477E	0x28D10
+0x4821	0x28D12
+0x4825	0x28EFA
+0x4826	0x28EF3
+0x4827	0x28EF2
+0x4828	0x28EF5
+0x4829	0x28EF6
+0x482A	0x28FBB
+0x482B	0x28FC2
+0x482C	0x290A7
+0x482F	0x290A8
+0x4830	0x290A3
+0x4832	0x290AA
+0x4836	0x291DC
+0x4839	0x2920F
+0x483C	0x29279
+0x483E	0x2927F
+0x483F	0x29285
+0x4845	0x2941B
+0x4848	0x29477
+0x4849	0x29476
+0x484A	0x29498
+0x484F	0x2947A
+0x4852	0x295BC
+0x4853	0x295BA
+0x4855	0x295B6
+0x4858	0x295B4
+0x485A	0x296CF
+0x4861	0x2987B
+0x4863	0x29A1C
+0x4864	0x29A21
+0x4865	0x29A1D
+0x4866	0x29AC0
+0x4868	0x29AFF
+0x486C	0x29D56
+0x486E	0x29FA1
+0x486F	0x29FA2
+0x4870	0x29FA6
+0x4871	0x2A256
+0x4872	0x2A257
+0x4875	0x2A301
+0x4876	0x2A3ED
+0x4877	0x2FA1C
+0x4878	0x2A5F2
+0x487A	0x203B8
+0x487C	0x203C0
+0x487E	0x203B7
+0x4921	0x203E1
+0x4924	0x207E8
+0x4926	0x208B2
+0x4928	0x20AAE
+0x492B	0x20F7E
+0x492F	0x20F76
+0x4932	0x20F96
+0x4934	0x21420
+0x4935	0x21421
+0x4936	0x21423
+0x4937	0x21429
+0x4938	0x21677
+0x4939	0x21851
+0x493B	0x21856
+0x493D	0x21888
+0x493E	0x21859
+0x493F	0x21855
+0x4941	0x21997
+0x4942	0x21998
+0x4947	0x21AA1
+0x4948	0x21AA3
+0x494E	0x21F0A
+0x4951	0x21F3D
+0x4952	0x21F0C
+0x4956	0x2213D
+0x4957	0x22139
+0x4958	0x222B0
+0x4959	0x222B2
+0x495A	0x222AE
+0x4960	0x22420
+0x4962	0x2256E
+0x4963	0x2256D
+0x4964	0x2256A
+0x4966	0x22832
+0x496A	0x22839
+0x496E	0x227A3
+0x4970	0x2287F
+0x4971	0x22835
+0x4972	0x2283D
+0x4973	0x229F4
+0x4974	0x229F5
+0x4977	0x22D48
+0x4978	0x22D28
+0x497B	0x22D27
+0x497C	0x22D32
+0x497D	0x22D2C
+0x4A21	0x22D2E
+0x4A25	0x22D23
+0x4A26	0x22D31
+0x4A27	0x2F8C5
+0x4A2C	0x22FC9
+0x4A2D	0x23089
+0x4A2F	0x230BB
+0x4A33	0x23397
+0x4A34	0x23393
+0x4A35	0x23628
+0x4A3B	0x23618
+0x4A3C	0x2363B
+0x4A3E	0x23627
+0x4A3F	0x23624
+0x4A40	0x2361B
+0x4A41	0x23631
+0x4A43	0x23626
+0x4A44	0x236A3
+0x4A45	0x2363F
+0x4A46	0x23622
+0x4A47	0x23619
+0x4A49	0x23641
+0x4A4A	0x2362B
+0x4A4D	0x2390C
+0x4A51	0x23A4E
+0x4A52	0x23AB9
+0x4A53	0x23AFA
+0x4A54	0x23BE9
+0x4A55	0x23BE8
+0x4A56	0x23BE4
+0x4A5A	0x23F5F
+0x4A5B	0x23F5D
+0x4A5C	0x23F52
+0x4A5E	0x23F74
+0x4A60	0x23F46
+0x4A63	0x23FAA
+0x4A65	0x23F4A
+0x4A66	0x23F59
+0x4A67	0x23F4B
+0x4A6B	0x24350
+0x4A70	0x246D0
+0x4A74	0x246CC
+0x4A78	0x24864
+0x4A79	0x24865
+0x4A7D	0x2485C
+0x4A7E	0x24A15
+0x4B28	0x24B79
+0x4B2B	0x24CC5
+0x4B2C	0x24CB8
+0x4B2D	0x24E2C
+0x4B30	0x24E37
+0x4B31	0x24E35
+0x4B32	0x24E31
+0x4B34	0x24E2F
+0x4B36	0x24E2B
+0x4B39	0x24E2D
+0x4B3A	0x24E2A
+0x4B3C	0x24F95
+0x4B3E	0x2523E
+0x4B40	0x25247
+0x4B41	0x25245
+0x4B46	0x25252
+0x4B48	0x25270
+0x4B49	0x25250
+0x4B4A	0x25258
+0x4B4B	0x25251
+0x4B4C	0x2523D
+0x4B4E	0x25241
+0x4B4F	0x2520C
+0x4B50	0x2523C
+0x4B51	0x25386
+0x4B52	0x25383
+0x4B53	0x25389
+0x4B54	0x253F3
+0x4B5A	0x2552D
+0x4B5F	0x256C5
+0x4B60	0x2F955
+0x4B67	0x25843
+0x4B69	0x25837
+0x4B6A	0x25845
+0x4B6D	0x259E5
+0x4B6E	0x25AA6
+0x4B6F	0x25BDB
+0x4B71	0x25BDA
+0x4B72	0x25BE6
+0x4B7C	0x25BF8
+0x4B7D	0x25BE9
+0x4C23	0x25BE8
+0x4C24	0x25BF6
+0x4C29	0x25BE7
+0x4C2F	0x25BD5
+0x4C32	0x25ED3
+0x4C33	0x25EC7
+0x4C34	0x25ED1
+0x4C36	0x25EC3
+0x4C38	0x26080
+0x4C39	0x26098
+0x4C3B	0x26084
+0x4C41	0x26097
+0x4C42	0x26083
+0x4C43	0x26081
+0x4C46	0x2608C
+0x4C47	0x26242
+0x4C48	0x263AB
+0x4C4A	0x263A3
+0x4C4B	0x263A6
+0x4C4C	0x2645C
+0x4C4D	0x26469
+0x4C4E	0x26467
+0x4C50	0x2658B
+0x4C51	0x265A8
+0x4C53	0x267D8
+0x4C56	0x2F989
+0x4C57	0x267DC
+0x4C59	0x267E0
+0x4C5A	0x267E5
+0x4C60	0x26918
+0x4C61	0x26919
+0x4C66	0x26A5F
+0x4C67	0x26A5E
+0x4C69	0x26E02
+0x4C75	0x26E12
+0x4C76	0x26E36
+0x4C79	0x2F9A8
+0x4C7B	0x26E23
+0x4C7C	0x26E03
+0x4C7E	0x26E00
+0x4D22	0x26E46
+0x4D23	0x26E61
+0x4D27	0x27384
+0x4D29	0x2736B
+0x4D2A	0x27362
+0x4D2B	0x27356
+0x4D2C	0x2736A
+0x4D2D	0x27352
+0x4D2E	0x27355
+0x4D32	0x27361
+0x4D33	0x2F9BB
+0x4D34	0x27358
+0x4D35	0x27377
+0x4D38	0x276D7
+0x4D3B	0x276DE
+0x4D3D	0x276DF
+0x4D41	0x276D1
+0x4D43	0x276E2
+0x4D44	0x276E1
+0x4D45	0x276DD
+0x4D49	0x2784B
+0x4D4B	0x2784E
+0x4D4D	0x278FC
+0x4D50	0x278FA
+0x4D52	0x278FB
+0x4D54	0x278FE
+0x4D57	0x27A31
+0x4D5D	0x27A38
+0x4D62	0x27A3A
+0x4D63	0x27BBB
+0x4D66	0x27C59
+0x4D69	0x27CDB
+0x4D6A	0x27CDF
+0x4D6B	0x27CE2
+0x4D6F	0x27D9E
+0x4D70	0x27DA1
+0x4D72	0x27F10
+0x4D7A	0x28076
+0x4D7B	0x2807F
+0x4D7C	0x2807D
+0x4E24	0x28082
+0x4E25	0x28257
+0x4E2C	0x2832E
+0x4E2F	0x2858B
+0x4E30	0x2858D
+0x4E34	0x28590
+0x4E36	0x286EC
+0x4E37	0x2876F
+0x4E38	0x2876B
+0x4E39	0x28771
+0x4E3A	0x28778
+0x4E42	0x289AD
+0x4E49	0x28D2F
+0x4E4B	0x28F78
+0x4E4D	0x291F8
+0x4E4E	0x29219
+0x4E50	0x2929B
+0x4E51	0x29294
+0x4E52	0x29297
+0x4E53	0x29299
+0x4E54	0x293A6
+0x4E55	0x293A4
+0x4E56	0x293A7
+0x4E58	0x29495
+0x4E5B	0x29490
+0x4E5E	0x2949B
+0x4E5F	0x295C4
+0x4E62	0x295C6
+0x4E68	0x296E3
+0x4E6A	0x296DF
+0x4E6B	0x296DD
+0x4E6C	0x296E7
+0x4E71	0x29A2D
+0x4E72	0x29A2C
+0x4E77	0x29A34
+0x4E78	0x29A38
+0x4E7A	0x29B1D
+0x4E7C	0x29B1A
+0x4E7D	0x29B1B
+0x4E7E	0x29B14
+0x4F22	0x29B17
+0x4F23	0x29C21
+0x4F26	0x29CAA
+0x4F27	0x29CA1
+0x4F2D	0x29D63
+0x4F2E	0x29D79
+0x4F2F	0x29D60
+0x4F31	0x29D62
+0x4F33	0x29D61
+0x4F36	0x29D70
+0x4F38	0x29D6A
+0x4F3A	0x29FC8
+0x4F3C	0x29FC5
+0x4F3D	0x29FBE
+0x4F3E	0x29FC2
+0x4F43	0x29FC7
+0x4F45	0x29FB0
+0x4F46	0x29FCA
+0x4F4E	0x2A30D
+0x4F4F	0x2A307
+0x4F50	0x2A396
+0x4F51	0x2A3EF
+0x4F54	0x2A41E
+0x4F55	0x2A41D
+0x4F57	0x2A590
+0x4F58	0x203EB
+0x4F5C	0x203EE
+0x4F5E	0x203EF
+0x4F5F	0x203EC
+0x4F60	0x207FA
+0x4F65	0x20904
+0x4F66	0x20FD3
+0x4F68	0x20FD1
+0x4F69	0x20FFA
+0x4F6E	0x20FC8
+0x4F70	0x20FD5
+0x4F72	0x20FCD
+0x4F73	0x20FD2
+0x4F74	0x20FFB
+0x4F75	0x2122A
+0x4F76	0x21488
+0x4F77	0x21461
+0x4F79	0x21463
+0x4F7A	0x21462
+0x4F7C	0x20057
+0x4F7D	0x218C8
+0x4F7E	0x21898
+0x5022	0x21AC1
+0x5023	0x21F3F
+0x5024	0x21F41
+0x5028	0x22152
+0x502A	0x2215E
+0x502D	0x222C7
+0x502F	0x22370
+0x5030	0x22427
+0x5032	0x22471
+0x5033	0x224B0
+0x5035	0x22842
+0x5036	0x22843
+0x503C	0x22857
+0x503D	0x2289D
+0x503E	0x22D89
+0x503F	0x22D8D
+0x5040	0x22D8B
+0x5041	0x22D80
+0x5042	0x22D92
+0x5043	0x22D8A
+0x5044	0x22DC8
+0x5046	0x22D8F
+0x5047	0x22D93
+0x5048	0x22D91
+0x504A	0x22FF2
+0x504B	0x22FDE
+0x504D	0x230C8
+0x5054	0x232A7
+0x5055	0x232A1
+0x5057	0x2368C
+0x5058	0x2367F
+0x505B	0x2367B
+0x505C	0x23695
+0x505D	0x23699
+0x505F	0x2368E
+0x5061	0x236DA
+0x5062	0x2368A
+0x5063	0x2369C
+0x5065	0x2367E
+0x5068	0x2391A
+0x5069	0x23A55
+0x506C	0x23A60
+0x5070	0x23BFB
+0x5073	0x23BFD
+0x5079	0x23FD0
+0x507C	0x23FC5
+0x507E	0x23FD2
+0x5121	0x24011
+0x5126	0x243AD
+0x5127	0x243A4
+0x5128	0x243A9
+0x5129	0x243B0
+0x512A	0x2439D
+0x512C	0x24598
+0x5131	0x24892
+0x5133	0x2488A
+0x5135	0x2488D
+0x5136	0x24896
+0x513B	0x24A45
+0x513C	0x24A4B
+0x513D	0x24B0F
+0x513E	0x24B16
+0x5140	0x24B8A
+0x5143	0x24CC9
+0x5145	0x24CC8
+0x5146	0x24CCA
+0x5147	0x24E64
+0x514B	0x24E5D
+0x514C	0x24E63
+0x5151	0x24E88
+0x5152	0x24F3A
+0x5153	0x24F39
+0x5158	0x25017
+0x5159	0x25093
+0x515B	0x25095
+0x515E	0x25276
+0x5162	0x25280
+0x5163	0x2527B
+0x5165	0x25248
+0x5166	0x252A8
+0x5167	0x25288
+0x5168	0x2538B
+0x5169	0x2538A
+0x516A	0x2538C
+0x516B	0x253FC
+0x516F	0x25558
+0x5171	0x25551
+0x5172	0x25555
+0x5173	0x25553
+0x5177	0x256DC
+0x517B	0x2585C
+0x517E	0x25865
+0x5221	0x2F95A
+0x5223	0x259EE
+0x5226	0x259F0
+0x5228	0x259F2
+0x522A	0x25C35
+0x522C	0x25C22
+0x522E	0x25C20
+0x5230	0x25C2D
+0x5231	0x25C28
+0x5232	0x25C26
+0x5233	0x25C3C
+0x5235	0x25C38
+0x523C	0x25C2A
+0x523E	0x25C1A
+0x523F	0x25C30
+0x5240	0x25BE3
+0x5241	0x25C19
+0x5242	0x25EE9
+0x5243	0x25EE7
+0x5245	0x260D6
+0x5246	0x260C4
+0x5248	0x26087
+0x524A	0x260C7
+0x524B	0x260D9
+0x524D	0x260DF
+0x5250	0x2630A
+0x5251	0x26301
+0x5252	0x263B1
+0x5254	0x263C1
+0x5257	0x26476
+0x5258	0x2650D
+0x5259	0x2650E
+0x525D	0x26807
+0x525F	0x26809
+0x5260	0x26816
+0x5265	0x2680E
+0x5268	0x26806
+0x5269	0x2691E
+0x526A	0x2694A
+0x5270	0x26EA6
+0x5271	0x26E91
+0x5274	0x26EB8
+0x5275	0x26E96
+0x5278	0x26EC5
+0x527D	0x26F0A
+0x5326	0x26EB2
+0x5328	0x26EB7
+0x5329	0x26EB4
+0x532A	0x26E89
+0x532B	0x26E8D
+0x532D	0x26E87
+0x532E	0x26EC2
+0x532F	0x26E9C
+0x5330	0x26E92
+0x5332	0x26ECA
+0x5334	0x26E8A
+0x5335	0x271E0
+0x5337	0x271E6
+0x5338	0x271E5
+0x533A	0x273A5
+0x533B	0x273B3
+0x533F	0x273B5
+0x5340	0x273AF
+0x5342	0x273B0
+0x5343	0x273CC
+0x5345	0x273A2
+0x5346	0x273BE
+0x5347	0x273C6
+0x5348	0x273AC
+0x5349	0x273AE
+0x534C	0x2F9C3
+0x534D	0x27708
+0x534E	0x27705
+0x5351	0x276FE
+0x5354	0x27700
+0x5357	0x27864
+0x5358	0x27868
+0x535D	0x2786A
+0x535E	0x27869
+0x535F	0x2790D
+0x5360	0x27912
+0x5363	0x2790F
+0x5365	0x27A67
+0x5366	0x27A79
+0x5367	0x27A72
+0x5368	0x27A66
+0x5369	0x27A7C
+0x536C	0x27A68
+0x536D	0x27A85
+0x536E	0x27A76
+0x536F	0x27A74
+0x5370	0x27A71
+0x5371	0x27A64
+0x5374	0x27BF8
+0x5376	0x27C6C
+0x5378	0x27CEB
+0x537C	0x27DB8
+0x5421	0x27F2D
+0x5422	0x27F2E
+0x5423	0x27F28
+0x5424	0x27F29
+0x5425	0x27F31
+0x5427	0x27F2F
+0x5428	0x27F2A
+0x542A	0x280A4
+0x542B	0x280B7
+0x542C	0x280BF
+0x5431	0x28263
+0x5435	0x28367
+0x5436	0x285BE
+0x5437	0x2F9E0
+0x5438	0x28795
+0x5439	0x2879C
+0x543E	0x28871
+0x543F	0x28872
+0x5441	0x2886F
+0x5444	0x289F1
+0x5447	0x289E8
+0x544A	0x2F9EA
+0x544D	0x28D49
+0x544E	0x28D64
+0x5450	0x28D48
+0x5454	0x28F2C
+0x5455	0x28FE1
+0x5456	0x28FEF
+0x5457	0x290C0
+0x545A	0x290D7
+0x545B	0x290D4
+0x545E	0x292AD
+0x5465	0x292AE
+0x5466	0x292AC
+0x546B	0x29427
+0x546C	0x294AE
+0x546E	0x294B0
+0x5471	0x294C0
+0x5472	0x294C4
+0x5479	0x29707
+0x547B	0x296FD
+0x5523	0x2FA04
+0x5524	0x2981B
+0x5525	0x2981C
+0x5527	0x298B2
+0x5528	0x298B4
+0x5529	0x298B7
+0x552A	0x298B1
+0x552B	0x298B3
+0x552C	0x298AE
+0x5533	0x29A3F
+0x5534	0x29B36
+0x5537	0x29B31
+0x5538	0x29B3B
+0x5539	0x29B35
+0x553A	0x29B3A
+0x553B	0x29B37
+0x553C	0x29C22
+0x553D	0x29C36
+0x553E	0x29C32
+0x5540	0x29CC0
+0x5546	0x29D85
+0x5549	0x29D89
+0x554C	0x29FE1
+0x5551	0x2A00A
+0x5553	0x2A009
+0x5556	0x29FE8
+0x555B	0x2A318
+0x5564	0x2A5C5
+0x5566	0x2040D
+0x5567	0x2040C
+0x5568	0x20421
+0x556A	0x20616
+0x556B	0x2080E
+0x556E	0x20817
+0x5571	0x21048
+0x5575	0x21055
+0x5576	0x21049
+0x5577	0x2104C
+0x5579	0x2104F
+0x557A	0x2103D
+0x557D	0x2148A
+0x557E	0x214A8
+0x5621	0x2168A
+0x5623	0x218CB
+0x5625	0x218D5
+0x5626	0x221D4
+0x5629	0x21F5C
+0x562A	0x21F75
+0x562C	0x22161
+0x562E	0x21696
+0x5630	0x2258A
+0x5631	0x228D0
+0x5634	0x22849
+0x5635	0x228CF
+0x5637	0x22DD6
+0x5638	0x22D7F
+0x563A	0x22DD2
+0x563B	0x22DCF
+0x563C	0x23006
+0x563D	0x23009
+0x5642	0x23706
+0x5643	0x236F1
+0x5644	0x23704
+0x5646	0x236FA
+0x5647	0x236F4
+0x564A	0x236F9
+0x564C	0x2368B
+0x564D	0x23703
+0x5650	0x239A2
+0x5654	0x23C0C
+0x5655	0x23C0B
+0x565A	0x24024
+0x565D	0x2F914
+0x565F	0x24025
+0x5661	0x243F6
+0x5663	0x243FB
+0x5665	0x24532
+0x5666	0x245FB
+0x5668	0x246F2
+0x5669	0x246F3
+0x566D	0x2489C
+0x566E	0x24A72
+0x5670	0x24A74
+0x5674	0x24B86
+0x5676	0x24B8E
+0x5677	0x24B90
+0x5679	0x24BCD
+0x567A	0x24BF7
+0x567B	0x24CD6
+0x567C	0x24E84
+0x567D	0x24E95
+0x567E	0x24E8A
+0x5723	0x24E97
+0x5727	0x24FA0
+0x5728	0x24FA1
+0x5729	0x25022
+0x572A	0x250A6
+0x572B	0x250A4
+0x5735	0x252AF
+0x5736	0x252B0
+0x5737	0x252BD
+0x573A	0x25576
+0x573C	0x2557B
+0x573D	0x25579
+0x5743	0x256EE
+0x5744	0x256F1
+0x5746	0x25894
+0x574A	0x25891
+0x574E	0x25A10
+0x5751	0x25AAF
+0x575C	0x25C7B
+0x575D	0x25C77
+0x5760	0x25C80
+0x5761	0x25CC6
+0x5763	0x25C7C
+0x5764	0x25C90
+0x5766	0x25CA3
+0x5767	0x25C7D
+0x5768	0x25CBD
+0x576C	0x25F13
+0x576F	0x26111
+0x5770	0x26144
+0x5771	0x2610D
+0x5774	0x26314
+0x5776	0x263B8
+0x5778	0x263B7
+0x5779	0x26483
+0x577C	0x26514
+0x577E	0x2651C
+0x5825	0x265D4
+0x5826	0x265D5
+0x5829	0x26843
+0x582A	0x26842
+0x582D	0x2F98A
+0x582E	0x26841
+0x582F	0x2694E
+0x5831	0x26A87
+0x5837	0x26F39
+0x5839	0x26F8F
+0x583A	0x26F2A
+0x583F	0x26F2B
+0x5841	0x26F50
+0x5843	0x26F6E
+0x5845	0x26F3B
+0x5846	0x26F53
+0x5847	0x26F5F
+0x5848	0x26F2F
+0x5849	0x26F30
+0x584A	0x26F38
+0x584B	0x26F4C
+0x584C	0x271F1
+0x5850	0x27407
+0x5851	0x27416
+0x5853	0x27414
+0x5855	0x273FB
+0x5859	0x273F8
+0x585A	0x27410
+0x585B	0x2741D
+0x585C	0x273FF
+0x585D	0x2740B
+0x585E	0x27404
+0x5860	0x273FE
+0x5861	0x275FF
+0x5866	0x27723
+0x586C	0x2792A
+0x586D	0x27AA0
+0x586E	0x27A98
+0x586F	0x27A9C
+0x5871	0x27A9E
+0x5872	0x27AA6
+0x5873	0x27AB5
+0x5874	0x27AB0
+0x5878	0x27CF9
+0x5879	0x27CF5
+0x587B	0x27DD2
+0x587E	0x27F50
+0x5921	0x27F4E
+0x5922	0x27F4B
+0x5923	0x27F52
+0x5924	0x27F4D
+0x5927	0x280E4
+0x5929	0x280DA
+0x592E	0x280DF
+0x592F	0x280E8
+0x5933	0x28370
+0x5934	0x28372
+0x5936	0x28377
+0x593A	0x285E6
+0x593B	0x287AA
+0x593E	0x2888C
+0x5940	0x28889
+0x5943	0x28A32
+0x5948	0x28A7A
+0x594A	0x28C9E
+0x594B	0x28CA0
+0x594C	0x28D70
+0x5950	0x28D6E
+0x5951	0x28D66
+0x5953	0x28D65
+0x5956	0x28F7F
+0x5957	0x28FE0
+0x5959	0x28FFF
+0x595A	0x290F6
+0x595B	0x290F7
+0x595C	0x290F5
+0x595E	0x290FC
+0x5961	0x290F9
+0x5965	0x292CA
+0x5966	0x292C3
+0x5967	0x292C6
+0x5969	0x293B8
+0x596A	0x293BD
+0x596C	0x293BC
+0x596D	0x29405
+0x596E	0x294E0
+0x596F	0x294E9
+0x5971	0x294DF
+0x5972	0x294EC
+0x5974	0x294E5
+0x5975	0x294DE
+0x5976	0x2FA00
+0x5978	0x294F0
+0x5979	0x294E3
+0x597B	0x295EC
+0x5A23	0x295F2
+0x5A24	0x295EF
+0x5A25	0x295E9
+0x5A26	0x296FB
+0x5A2B	0x29737
+0x5A2C	0x298DE
+0x5A2F	0x298DA
+0x5A32	0x29A4B
+0x5A34	0x29A49
+0x5A36	0x29AD5
+0x5A39	0x29B52
+0x5A3A	0x29B47
+0x5A3C	0x29B48
+0x5A3D	0x29CCC
+0x5A3E	0x29CD0
+0x5A46	0x29D86
+0x5A47	0x29DA7
+0x5A48	0x29DA3
+0x5A4A	0x29DB6
+0x5A4B	0x29DAD
+0x5A4C	0x2A013
+0x5A53	0x2A017
+0x5A54	0x2A022
+0x5A57	0x2A049
+0x5A58	0x2A026
+0x5A59	0x2FA0C
+0x5A5A	0x2A03C
+0x5A5B	0x2A028
+0x5A5C	0x2A2A8
+0x5A5E	0x2A3FB
+0x5A60	0x2A432
+0x5A61	0x2A4D6
+0x5A62	0x2A548
+0x5A65	0x2A5C6
+0x5A69	0x20425
+0x5A6A	0x20426
+0x5A6B	0x20424
+0x5A6C	0x20433
+0x5A6D	0x20570
+0x5A6F	0x20B90
+0x5A71	0x21095
+0x5A72	0x210A1
+0x5A73	0x21092
+0x5A74	0x2108F
+0x5A75	0x2109F
+0x5A76	0x21096
+0x5A77	0x21098
+0x5A78	0x2109D
+0x5A79	0x210A0
+0x5A7B	0x21697
+0x5A7C	0x218EB
+0x5A7E	0x21F87
+0x5B22	0x22432
+0x5B26	0x228D8
+0x5B27	0x228FB
+0x5B28	0x22906
+0x5B2A	0x228D1
+0x5B2C	0x2F8B0
+0x5B33	0x22DF6
+0x5B34	0x22E04
+0x5B35	0x22DFE
+0x5B37	0x22DFF
+0x5B38	0x22DF7
+0x5B39	0x23018
+0x5B3B	0x23014
+0x5B3C	0x230CD
+0x5B3D	0x23120
+0x5B3E	0x232DE
+0x5B42	0x23745
+0x5B43	0x23753
+0x5B45	0x2374B
+0x5B46	0x23755
+0x5B47	0x23741
+0x5B4B	0x2375C
+0x5B4C	0x23754
+0x5B4D	0x23A71
+0x5B4E	0x23AD0
+0x5B51	0x23C53
+0x5B52	0x24029
+0x5B53	0x2407E
+0x5B55	0x24079
+0x5B58	0x24070
+0x5B59	0x2406A
+0x5B5C	0x24085
+0x5B5D	0x24064
+0x5B5F	0x24078
+0x5B61	0x24432
+0x5B62	0x24427
+0x5B63	0x2442F
+0x5B68	0x248BA
+0x5B6A	0x24A71
+0x5B6B	0x24A8C
+0x5B6D	0x24B1A
+0x5B70	0x24B98
+0x5B71	0x24CE4
+0x5B76	0x24EC2
+0x5B78	0x24EBA
+0x5B7A	0x24EC8
+0x5C21	0x250B9
+0x5C22	0x250B8
+0x5C23	0x250A5
+0x5C24	0x252E2
+0x5C28	0x252D9
+0x5C2B	0x252AC
+0x5C2C	0x252DD
+0x5C30	0x2559D
+0x5C33	0x25711
+0x5C34	0x25703
+0x5C38	0x258EE
+0x5C3C	0x25CA4
+0x5C3D	0x25CD8
+0x5C3E	0x25CDD
+0x5C3F	0x25CDE
+0x5C41	0x25CE7
+0x5C45	0x25CD4
+0x5C47	0x25CCE
+0x5C4D	0x25CF1
+0x5C4E	0x25CD3
+0x5C52	0x25CCA
+0x5C53	0x25CE9
+0x5C57	0x25F1A
+0x5C58	0x25F41
+0x5C59	0x2F968
+0x5C5C	0x2613D
+0x5C5D	0x26140
+0x5C61	0x26143
+0x5C63	0x2613F
+0x5C64	0x2613C
+0x5C66	0x26321
+0x5C67	0x26320
+0x5C69	0x263C6
+0x5C6C	0x263D1
+0x5C6D	0x263CA
+0x5C6E	0x2648E
+0x5C6F	0x26491
+0x5C72	0x265E3
+0x5C73	0x26888
+0x5C75	0x26870
+0x5C77	0x2699D
+0x5C78	0x26A9D
+0x5C79	0x26A91
+0x5C7A	0x26A98
+0x5C7B	0x26A99
+0x5D22	0x26FBF
+0x5D24	0x26FAE
+0x5D25	0x26FB1
+0x5D26	0x26FCC
+0x5D27	0x27004
+0x5D29	0x27016
+0x5D2A	0x26FCD
+0x5D2D	0x26FE0
+0x5D2E	0x26FCB
+0x5D2F	0x26FD4
+0x5D30	0x26FC9
+0x5D31	0x271FF
+0x5D33	0x271FD
+0x5D34	0x27457
+0x5D35	0x27452
+0x5D36	0x27450
+0x5D37	0x27445
+0x5D38	0x2744D
+0x5D3A	0x27453
+0x5D3C	0x27482
+0x5D3D	0x27444
+0x5D3E	0x275CE
+0x5D3F	0x275CF
+0x5D40	0x275D2
+0x5D41	0x27602
+0x5D42	0x2774F
+0x5D43	0x27758
+0x5D45	0x27743
+0x5D47	0x27752
+0x5D4B	0x27749
+0x5D4C	0x27753
+0x5D4D	0x2774D
+0x5D4F	0x27884
+0x5D51	0x27883
+0x5D52	0x27932
+0x5D53	0x27AE2
+0x5D55	0x27AE4
+0x5D56	0x27AD3
+0x5D58	0x27AD5
+0x5D59	0x27ADD
+0x5D5C	0x27AEC
+0x5D5D	0x27AE6
+0x5D5E	0x27AD2
+0x5D5F	0x27AFA
+0x5D60	0x27ADA
+0x5D62	0x27C06
+0x5D63	0x27C04
+0x5D65	0x27C7B
+0x5D66	0x27D04
+0x5D67	0x27D02
+0x5D6B	0x27F60
+0x5D6F	0x28107
+0x5D70	0x28105
+0x5D71	0x2810C
+0x5D73	0x2815A
+0x5D76	0x2811A
+0x5D79	0x2838A
+0x5E21	0x2838C
+0x5E22	0x28609
+0x5E23	0x288A6
+0x5E25	0x288AC
+0x5E26	0x288A9
+0x5E28	0x28A8B
+0x5E2A	0x28A8C
+0x5E2D	0x28A88
+0x5E2E	0x28A89
+0x5E30	0x28A93
+0x5E33	0x28D83
+0x5E34	0x28F4F
+0x5E37	0x29120
+0x5E39	0x29236
+0x5E3A	0x292E2
+0x5E3D	0x292EE
+0x5E3F	0x292E7
+0x5E40	0x292E9
+0x5E44	0x292DF
+0x5E46	0x293C7
+0x5E48	0x29509
+0x5E4A	0x29501
+0x5E53	0x29605
+0x5E54	0x2960C
+0x5E55	0x29778
+0x5E56	0x2975D
+0x5E5C	0x2975E
+0x5E5D	0x29760
+0x5E5E	0x29767
+0x5E60	0x2FA05
+0x5E61	0x298F4
+0x5E64	0x298F1
+0x5E66	0x298FA
+0x5E69	0x298F8
+0x5E6A	0x298F9
+0x5E6B	0x29909
+0x5E6C	0x298FD
+0x5E6D	0x298F7
+0x5E6F	0x29A59
+0x5E71	0x29B60
+0x5E72	0x29B68
+0x5E78	0x29B6A
+0x5E79	0x29C14
+0x5E7A	0x29C3E
+0x5E7B	0x29CE4
+0x5F28	0x29DD2
+0x5F2D	0x2A058
+0x5F2E	0x2A050
+0x5F30	0x2A05C
+0x5F33	0x28119
+0x5F37	0x2FA0E
+0x5F41	0x2A4DF
+0x5F47	0x2A5D9
+0x5F4B	0x20966
+0x5F4E	0x210E1
+0x5F4F	0x210EF
+0x5F50	0x210E8
+0x5F51	0x21233
+0x5F53	0x218FE
+0x5F56	0x21AEF
+0x5F57	0x21AEC
+0x5F58	0x21CEC
+0x5F59	0x21F9C
+0x5F5B	0x21F99
+0x5F5C	0x22170
+0x5F5D	0x2216E
+0x5F5F	0x22441
+0x5F62	0x22902
+0x5F63	0x22901
+0x5F65	0x22A1B
+0x5F66	0x22E23
+0x5F67	0x22E25
+0x5F68	0x22E24
+0x5F69	0x22E26
+0x5F6A	0x22E33
+0x5F6B	0x22E2F
+0x5F6C	0x2308F
+0x5F6D	0x23356
+0x5F74	0x23799
+0x5F76	0x2F8ED
+0x5F78	0x23AD9
+0x5F7A	0x240B7
+0x5F7C	0x240B6
+0x6021	0x24454
+0x6022	0x24457
+0x6023	0x2447A
+0x6026	0x24A8E
+0x6028	0x24A90
+0x6029	0x24AB9
+0x602D	0x24CEF
+0x6031	0x24EE2
+0x6033	0x24ED6
+0x6034	0x24ED8
+0x6035	0x24EDA
+0x6036	0x24EDE
+0x603A	0x25308
+0x603B	0x25304
+0x603C	0x2530A
+0x603D	0x2530B
+0x603E	0x25302
+0x6040	0x255AA
+0x6041	0x255C1
+0x6043	0x258D7
+0x6044	0x258D9
+0x6046	0x258DE
+0x6047	0x258DA
+0x604A	0x25A2A
+0x604D	0x25D31
+0x604F	0x25D2B
+0x6050	0x25D2C
+0x6051	0x25D29
+0x6052	0x25D2E
+0x6054	0x25D27
+0x6055	0x25D28
+0x6057	0x25D5F
+0x6058	0x25D30
+0x6059	0x25D24
+0x605C	0x25F3A
+0x605E	0x25F39
+0x605F	0x25F40
+0x6060	0x26180
+0x6061	0x26184
+0x6064	0x26175
+0x6065	0x26176
+0x6067	0x2617C
+0x6069	0x26178
+0x606A	0x2619B
+0x606B	0x2617E
+0x606C	0x2625A
+0x606E	0x2632C
+0x6070	0x2649C
+0x6071	0x26847
+0x6072	0x2688A
+0x6075	0x26927
+0x6076	0x2704A
+0x6079	0x27027
+0x607C	0x2702E
+0x607D	0x27026
+0x607E	0x27208
+0x6122	0x274BD
+0x6123	0x27496
+0x6127	0x274BE
+0x6128	0x2748E
+0x6129	0x27774
+0x612B	0x27780
+0x6132	0x2793C
+0x6133	0x2793D
+0x6135	0x2793A
+0x6136	0x27942
+0x6138	0x27B24
+0x6139	0x27B06
+0x613C	0x27B15
+0x613E	0x27B02
+0x613F	0x27B0C
+0x6141	0x27B08
+0x6142	0x27B0A
+0x6143	0x27B05
+0x6144	0x27B1C
+0x6147	0x27C82
+0x6149	0x27C86
+0x614B	0x27E03
+0x614C	0x27F7B
+0x614E	0x27F7A
+0x6153	0x28180
+0x6155	0x28158
+0x615A	0x283AA
+0x615B	0x283AB
+0x615C	0x28436
+0x615D	0x2844A
+0x6160	0x287D6
+0x616A	0x28B03
+0x616B	0x28ACF
+0x616D	0x28D9F
+0x616E	0x28DA2
+0x616F	0x2902A
+0x6170	0x2902F
+0x6171	0x29144
+0x6172	0x29140
+0x6175	0x29311
+0x6176	0x2930F
+0x6178	0x2930D
+0x6179	0x29307
+0x617A	0x29303
+0x6221	0x29435
+0x6224	0x29504
+0x622A	0x29526
+0x622E	0x2951E
+0x6231	0x2960E
+0x6233	0x2961D
+0x6234	0x2961E
+0x6235	0x2961F
+0x6237	0x29788
+0x6239	0x2978D
+0x623A	0x29791
+0x623B	0x29780
+0x623D	0x29854
+0x623E	0x29855
+0x6242	0x29925
+0x6243	0x2991A
+0x624B	0x29B88
+0x624D	0x29B7A
+0x6250	0x29B80
+0x6251	0x29D1E
+0x6252	0x29DFC
+0x6253	0x29E25
+0x6258	0x29E0B
+0x625A	0x29E06
+0x625B	0x29E04
+0x625E	0x29DF9
+0x625F	0x29E00
+0x6263	0x29E02
+0x6265	0x29E07
+0x6269	0x2A0B5
+0x626B	0x2A087
+0x626D	0x2A093
+0x626E	0x2FA0F
+0x6270	0x2A0BE
+0x6271	0x2A266
+0x6273	0x2A2C7
+0x6274	0x2A2CF
+0x6278	0x2A33D
+0x627A	0x2A33C
+0x627B	0x2A347
+0x6322	0x2A3C3
+0x6325	0x2A51B
+0x6328	0x2A5C9
+0x632A	0x2A5DD
+0x632C	0x2A693
+0x632E	0x2043D
+0x6333	0x214E6
+0x6336	0x21AF7
+0x6337	0x21FB0
+0x6338	0x21FAE
+0x633D	0x2259F
+0x633E	0x2259E
+0x633F	0x22930
+0x6341	0x2294F
+0x6344	0x22927
+0x6345	0x22951
+0x6348	0x22E51
+0x6349	0x22E54
+0x634A	0x22E56
+0x634B	0x23027
+0x634D	0x23024
+0x6352	0x237EC
+0x6353	0x237C4
+0x6356	0x240F8
+0x6357	0x240F6
+0x6358	0x240F7
+0x6359	0x240ED
+0x635C	0x240F4
+0x635D	0x240EF
+0x6360	0x2447F
+0x6361	0x244A2
+0x6362	0x2447E
+0x6364	0x248C5
+0x636A	0x24EF1
+0x636B	0x24EF2
+0x636D	0x2502F
+0x6372	0x25323
+0x6373	0x25329
+0x6377	0x2571B
+0x6378	0x258EB
+0x637A	0x258EA
+0x637B	0x25A33
+0x637D	0x25D63
+0x6421	0x25D92
+0x6422	0x25D65
+0x6425	0x261A0
+0x6426	0x2F970
+0x6427	0x2625E
+0x6429	0x268AA
+0x642B	0x268A9
+0x642E	0x2709C
+0x6431	0x27092
+0x6435	0x27086
+0x6439	0x27083
+0x643F	0x2F9C2
+0x6442	0x274CE
+0x6445	0x27793
+0x6449	0x27B2E
+0x644A	0x27B27
+0x644B	0x27B28
+0x6450	0x27E18
+0x6451	0x27E16
+0x6452	0x27F8D
+0x6454	0x27F8E
+0x6457	0x27F90
+0x6458	0x27F8F
+0x6459	0x28181
+0x645C	0x2818A
+0x645D	0x2818C
+0x645E	0x2828D
+0x6462	0x283B2
+0x6464	0x287D9
+0x6468	0x28B0D
+0x646A	0x28B13
+0x646E	0x28B1B
+0x6470	0x28DAC
+0x6472	0x28DB3
+0x6474	0x2915E
+0x6476	0x29160
+0x6477	0x29168
+0x6478	0x29163
+0x6479	0x29169
+0x647A	0x29167
+0x647D	0x29328
+0x6521	0x2932E
+0x6522	0x29330
+0x6524	0x29326
+0x6525	0x29331
+0x6526	0x29341
+0x6528	0x293DA
+0x652A	0x2F9FA
+0x652B	0x2940B
+0x652D	0x29534
+0x652E	0x29533
+0x6532	0x29539
+0x6533	0x2953B
+0x6534	0x29540
+0x6535	0x29630
+0x6537	0x29632
+0x6538	0x29637
+0x653D	0x29781
+0x653E	0x2979F
+0x653F	0x297A7
+0x6542	0x29944
+0x6543	0x29947
+0x6544	0x29948
+0x6545	0x2993D
+0x6548	0x29949
+0x654A	0x29A80
+0x654B	0x29BA0
+0x654C	0x29B9D
+0x6550	0x29B9C
+0x6551	0x29C47
+0x6552	0x29D07
+0x6556	0x29E49
+0x6558	0x29E44
+0x655C	0x29EDF
+0x655E	0x29E4C
+0x6560	0x29E4F
+0x6563	0x2A0C1
+0x6565	0x2A0B9
+0x6566	0x2A0CB
+0x6567	0x2A0CF
+0x6568	0x2A0C4
+0x656D	0x2A0CA
+0x656E	0x2A0C3
+0x656F	0x2A2D0
+0x6570	0x2A351
+0x6573	0x2A3A8
+0x6574	0x2A3C7
+0x6575	0x2A3C6
+0x6577	0x2A3CA
+0x6578	0x2A402
+0x657A	0x2A45D
+0x657B	0x2A45A
+0x657E	0x2A459
+0x6622	0x2A4CC
+0x6623	0x2A51C
+0x6624	0x2A5CC
+0x6628	0x2A5E8
+0x6629	0x2A5EC
+0x662A	0x2A5EA
+0x662B	0x2A6AD
+0x662C	0x2A6B0
+0x662D	0x2045F
+0x662E	0x20458
+0x662F	0x20457
+0x6631	0x20B93
+0x6633	0x2113B
+0x6635	0x21134
+0x6636	0x214F2
+0x6638	0x21AFD
+0x6639	0x21C1D
+0x663C	0x22304
+0x663D	0x22448
+0x663E	0x22958
+0x663F	0x22E4F
+0x6641	0x22E6E
+0x6642	0x22E72
+0x6644	0x2302E
+0x6645	0x237FC
+0x6646	0x237F4
+0x6647	0x23C36
+0x6648	0x2410E
+0x664B	0x24114
+0x664D	0x24119
+0x664F	0x244A6
+0x6651	0x24AC9
+0x6652	0x24AC0
+0x6653	0x24ACC
+0x6654	0x24B1B
+0x6655	0x24BAA
+0x6656	0x24BA8
+0x6657	0x24F03
+0x665C	0x25035
+0x6662	0x255D9
+0x6666	0x25A3F
+0x6667	0x25A3D
+0x666B	0x25D8B
+0x6670	0x25D68
+0x6671	0x25D8A
+0x6672	0x25F58
+0x6673	0x25F57
+0x6674	0x261CE
+0x6675	0x261BC
+0x6676	0x261C0
+0x6677	0x261C1
+0x6678	0x261BF
+0x6679	0x261AB
+0x667A	0x2625F
+0x667C	0x264A6
+0x667E	0x26529
+0x6726	0x268B8
+0x6729	0x270DD
+0x672A	0x270D6
+0x672B	0x2F9B1
+0x672C	0x270D5
+0x672D	0x270E7
+0x672E	0x270D8
+0x672F	0x274EC
+0x6731	0x27500
+0x6732	0x27507
+0x6733	0x274FD
+0x6734	0x274F1
+0x6735	0x274FF
+0x6736	0x277AA
+0x6737	0x277B0
+0x6738	0x27B48
+0x673A	0x27B53
+0x673C	0x27B4D
+0x6742	0x27B43
+0x6743	0x27B50
+0x6746	0x27C8C
+0x6747	0x27E27
+0x6749	0x27F99
+0x674B	0x281B1
+0x674D	0x281B0
+0x674E	0x281AA
+0x674F	0x281AC
+0x6753	0x283C8
+0x6754	0x283CA
+0x6755	0x28642
+0x6756	0x287E0
+0x6757	0x288E7
+0x6758	0x288E8
+0x6759	0x288E6
+0x675D	0x28B5B
+0x675E	0x28B56
+0x6760	0x28B5A
+0x6764	0x28CB8
+0x6765	0x28DC5
+0x6768	0x29048
+0x6769	0x2917D
+0x676A	0x2917C
+0x676B	0x29181
+0x676C	0x29182
+0x676D	0x29162
+0x676F	0x29345
+0x6774	0x293E3
+0x6778	0x29550
+0x677A	0x2954F
+0x677D	0x29639
+0x6821	0x2963A
+0x6825	0x297C1
+0x6826	0x2994E
+0x6827	0x2996E
+0x682C	0x29971
+0x682E	0x29A8C
+0x682F	0x29A89
+0x6831	0x29AE5
+0x6832	0x29BB3
+0x6833	0x29BB6
+0x6834	0x29BB4
+0x6835	0x29C4D
+0x6837	0x29D13
+0x6838	0x29E78
+0x683F	0x29E72
+0x6845	0x2A275
+0x6846	0x2A2DA
+0x6847	0x2A2D7
+0x684F	0x2FA16
+0x6850	0x2A469
+0x6851	0x2A467
+0x6853	0x2A466
+0x6854	0x2A46F
+0x6855	0x2A471
+0x6857	0x2A4CF
+0x6858	0x2A523
+0x685B	0x2A5A5
+0x685D	0x2A5FE
+0x685E	0x2A5FB
+0x685F	0x2A5FD
+0x6864	0x2116D
+0x6866	0x21B05
+0x6867	0x21C20
+0x6869	0x21FC8
+0x686A	0x21FC9
+0x686D	0x23127
+0x686F	0x2381E
+0x6870	0x23936
+0x6872	0x2413D
+0x6874	0x248D7
+0x6876	0x24BAD
+0x6877	0x24D00
+0x6879	0x2533A
+0x687D	0x25726
+0x6923	0x25DB7
+0x6924	0x25DB6
+0x6925	0x25DC0
+0x6927	0x25D9B
+0x6929	0x261D8
+0x692F	0x268C0
+0x6931	0x268BF
+0x6932	0x26ABF
+0x6934	0x27120
+0x6935	0x270D0
+0x6936	0x2710E
+0x6938	0x2711D
+0x6939	0x2711E
+0x693A	0x27115
+0x693B	0x27114
+0x693C	0x2751E
+0x693D	0x2752C
+0x693F	0x277B9
+0x6940	0x277B8
+0x6941	0x277B6
+0x6942	0x2789E
+0x6943	0x2789C
+0x6944	0x2794D
+0x6946	0x27B6E
+0x6947	0x27B60
+0x6949	0x27B64
+0x694A	0x27B62
+0x694B	0x261E5
+0x694D	0x27FA3
+0x6950	0x283D2
+0x6951	0x283D5
+0x6957	0x29055
+0x6959	0x29193
+0x695D	0x29356
+0x695F	0x293E9
+0x6961	0x29445
+0x6964	0x2967C
+0x6966	0x297D3
+0x696C	0x2998E
+0x696D	0x29A97
+0x696F	0x29A9B
+0x6970	0x29A99
+0x6973	0x29BCF
+0x6975	0x29C59
+0x6978	0x29D20
+0x6979	0x29D23
+0x697A	0x29D2A
+0x6A22	0x29EB0
+0x6A24	0x2A12F
+0x6A28	0x2A132
+0x6A29	0x2A143
+0x6A2A	0x2A13F
+0x6A2B	0x2A139
+0x6A2D	0x2A130
+0x6A2E	0x2A2DD
+0x6A2F	0x2A3DA
+0x6A30	0x2A3DB
+0x6A32	0x2A484
+0x6A33	0x2A47F
+0x6A34	0x2A472
+0x6A35	0x2A480
+0x6A36	0x2A4EE
+0x6A38	0x2A52A
+0x6A39	0x2A522
+0x6A3A	0x2A571
+0x6A3B	0x2A5CD
+0x6A3E	0x2A60F
+0x6A3F	0x2A618
+0x6A40	0x2046A
+0x6A45	0x21B0C
+0x6A47	0x225A6
+0x6A4A	0x23037
+0x6A4D	0x23AE2
+0x6A4F	0x244BC
+0x6A52	0x24AD5
+0x6A56	0x24F12
+0x6A58	0x2534B
+0x6A59	0x25341
+0x6A5A	0x253A1
+0x6A5B	0x255EC
+0x6A5E	0x25DD4
+0x6A5F	0x25DD8
+0x6A60	0x25DD9
+0x6A62	0x25DDA
+0x6A63	0x25F6C
+0x6A64	0x25F6D
+0x6A67	0x261E7
+0x6A68	0x261EB
+0x6A69	0x261EC
+0x6A6A	0x26262
+0x6A6C	0x2652B
+0x6A6D	0x2660D
+0x6A6E	0x268CD
+0x6A6F	0x26AC3
+0x6A70	0x2713F
+0x6A71	0x2713C
+0x6A72	0x2713E
+0x6A73	0x2713D
+0x6A74	0x2713A
+0x6A75	0x27138
+0x6A76	0x27544
+0x6A77	0x27545
+0x6A79	0x27548
+0x6A7A	0x27550
+0x6A7D	0x27B78
+0x6A7E	0x27B79
+0x6B22	0x27E3E
+0x6B25	0x28654
+0x6B28	0x28BB9
+0x6B2B	0x2905F
+0x6B2E	0x29572
+0x6B2F	0x29575
+0x6B36	0x29AA3
+0x6B37	0x29AA5
+0x6B38	0x29BDC
+0x6B39	0x29BDD
+0x6B3A	0x29C5A
+0x6B3E	0x29EDB
+0x6B3F	0x29EDC
+0x6B41	0x2A1AB
+0x6B42	0x2A184
+0x6B43	0x2A176
+0x6B49	0x2A183
+0x6B4C	0x2A27F
+0x6B4F	0x2A373
+0x6B50	0x2A3AD
+0x6B51	0x2A3B0
+0x6B53	0x2A40F
+0x6B54	0x2A40C
+0x6B57	0x2A579
+0x6B59	0x2A577
+0x6B5A	0x2A57A
+0x6B5D	0x2A632
+0x6B5E	0x2A627
+0x6B5F	0x2A62A
+0x6B60	0x2A62C
+0x6B62	0x2A628
+0x6B63	0x2A629
+0x6B64	0x2A638
+0x6B65	0x2082F
+0x6B66	0x2117B
+0x6B67	0x21B0D
+0x6B69	0x21FD6
+0x6B6A	0x21FD5
+0x6B6B	0x22EA1
+0x6B6C	0x2384C
+0x6B73	0x24FC0
+0x6B77	0x25DF4
+0x6B7A	0x261F0
+0x6B7C	0x2633F
+0x6B7E	0x2755D
+0x6C21	0x27572
+0x6C22	0x27562
+0x6C24	0x27566
+0x6C27	0x27B88
+0x6C2A	0x281E8
+0x6C2B	0x281E4
+0x6C2F	0x288FF
+0x6C31	0x291AF
+0x6C32	0x291AE
+0x6C35	0x293F2
+0x6C36	0x29448
+0x6C37	0x29581
+0x6C38	0x2957E
+0x6C3B	0x29652
+0x6C3C	0x297EF
+0x6C3F	0x29AAD
+0x6C40	0x29BE6
+0x6C42	0x29BED
+0x6C44	0x29BE9
+0x6C45	0x29C61
+0x6C46	0x29C60
+0x6C47	0x29D33
+0x6C4B	0x29F0B
+0x6C4C	0x29F08
+0x6C4F	0x29F07
+0x6C53	0x2A1CA
+0x6C55	0x2A1C6
+0x6C57	0x2A284
+0x6C58	0x2A2EB
+0x6C59	0x2A37D
+0x6C5C	0x2A49B
+0x6C5D	0x2A4A2
+0x6C5E	0x2A4A1
+0x6C5F	0x2A4A0
+0x6C60	0x2A49C
+0x6C63	0x2A580
+0x6C65	0x2A640
+0x6C67	0x2A639
+0x6C68	0x2A63C
+0x6C6B	0x208CA
+0x6C6D	0x21189
+0x6C6F	0x2303C
+0x6C70	0x23940
+0x6C71	0x24163
+0x6C72	0x24169
+0x6C74	0x25353
+0x6C77	0x25917
+0x6C78	0x2591A
+0x6C79	0x25E00
+0x6C7E	0x2756F
+0x6D21	0x278AB
+0x6D23	0x27B91
+0x6D26	0x27FB1
+0x6D28	0x281EF
+0x6D29	0x28DF1
+0x6D2A	0x28DF2
+0x6D2B	0x291B7
+0x6D2C	0x291B5
+0x6D2E	0x29586
+0x6D2F	0x2965A
+0x6D31	0x299C6
+0x6D32	0x299CB
+0x6D34	0x29AB2
+0x6D36	0x29BF3
+0x6D38	0x29F27
+0x6D3B	0x2A1D5
+0x6D3C	0x2A1D8
+0x6D3E	0x2A1EC
+0x6D3F	0x2A287
+0x6D40	0x2A2F2
+0x6D45	0x2A4AD
+0x6D46	0x2A4B0
+0x6D47	0x2A4FD
+0x6D49	0x2A587
+0x6D4A	0x2A64A
+0x6D4D	0x2A64E
+0x6D4E	0x2A649
+0x6D4F	0x2A651
+0x6D50	0x2A64D
+0x6D52	0x20472
+0x6D54	0x21B16
+0x6D55	0x2386D
+0x6D56	0x23941
+0x6D58	0x24171
+0x6D59	0x24174
+0x6D5D	0x25F7C
+0x6D5F	0x2718A
+0x6D60	0x27956
+0x6D63	0x28BFA
+0x6D66	0x2965B
+0x6D6A	0x2A1F5
+0x6D6B	0x2A1F0
+0x6D6C	0x2A2F3
+0x6D6D	0x2A37F
+0x6D6E	0x2A413
+0x6D71	0x21B19
+0x6D72	0x22985
+0x6D73	0x22EB0
+0x6D74	0x24177
+0x6D75	0x255FF
+0x6D7A	0x27187
+0x6D7C	0x2718B
+0x6D7E	0x27B9E
+0x6E23	0x2958F
+0x6E26	0x29839
+0x6E27	0x299D4
+0x6E28	0x29AF1
+0x6E29	0x29C02
+0x6E2A	0x29C6B
+0x6E2B	0x29D40
+0x6E2E	0x2A210
+0x6E2F	0x2A4BE
+0x6E30	0x2A4B9
+0x6E32	0x2A664
+0x6E34	0x24AE9
+0x6E35	0x27190
+0x6E38	0x2721C
+0x6E3A	0x27592
+0x6E3B	0x278AE
+0x6E3C	0x27BA3
+0x6E3E	0x291C9
+0x6E40	0x299D8
+0x6E41	0x29D44
+0x6E42	0x2A224
+0x6E46	0x2A670
+0x6E47	0x2A6D3
+0x6E4A	0x2A4C3
+0x6E4E	0x25E21
+0x6E4F	0x26ACA
+0x6E50	0x2759C
+0x6E51	0x29C73
+0x6E52	0x2A386
+0x6E53	0x2A5C1
+0x6E54	0x29C09
+0x6E56	0x2A6D5
+0x6E5C	0x291D4
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates
new file mode 100644
index 0000000..7c7131f
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates
@@ -0,0 +1,8143 @@
+0x2121	0x200D1	
+0x2122	0x200CB	
+0x2123	0x200C9	
+0x2124	0x2010C	
+0x2125	0x20000	
+0x2126	0x20087	
+0x2127	0x2010D	
+0x2128	0x2010F	
+0x2129	0x2F81D	
+0x212A	0x22398	
+0x212B	0x200D2	
+0x212C	0x20111	
+0x212D	0x2007E	
+0x212E	0x20AD3	
+0x212F	0x21552	
+0x2130	0x21CFE	
+0x2131	0x225A9	
+0x2132	0x23942	
+0x2133	0x20009	
+0x2134	0x200D6	
+0x2135	0x204DD	
+0x2136	0x204DC	
+0x2137	0x20502	
+0x2138	0x20573	
+0x2139	0x20676	
+0x213A	0x206A7	
+0x213B	0x206A8	
+0x213C	0x20833	
+0x213D	0x208CC	
+0x213E	0x20A0D	
+0x213F	0x20A2C	
+0x2140	0x20B1B	
+0x2142	0x20B1D	
+0x2143	0x20B99	
+0x2144	0x2123E	
+0x2145	0x21D2D	
+0x2146	0x21D2F	
+0x2147	0x22399	
+0x2148	0x233B3	
+0x2149	0x239B6	
+0x214A	0x23B1B	
+0x214B	0x244EF	
+0x214C	0x248E9	
+0x214D	0x20014	
+0x214E	0x20094	
+0x214F	0x200E1	
+0x2150	0x20506	
+0x2151	0x2054A	
+0x2152	0x20544	
+0x2153	0x20631	
+0x2154	0x2067A	
+0x2155	0x206AD	
+0x2156	0x206AE	
+0x2157	0x206B1	
+0x2158	0x20838	
+0x2159	0x20837	
+0x215A	0x2097D	
+0x215B	0x2097E	
+0x215C	0x20A2D	
+0x215D	0x20A32	
+0x215E	0x20B23	
+0x215F	0x20B26	
+0x2160	0x2F83A	
+0x2161	0x20BA0	
+0x2162	0x216A8	
+0x2163	0x2193F	
+0x2164	0x219BC	
+0x2165	0x21BC4	
+0x2166	0x21D3B	
+0x2167	0x22019	
+0x2168	0x22018	
+0x2169	0x221B3	
+0x216A	0x223AA	
+0x216B	0x224BE	
+0x216C	0x225AC	
+0x216D	0x22A25	
+0x216E	0x22A66	
+0x216F	0x22A6B	
+0x2170	0x23943	
+0x2171	0x239B5	
+0x2172	0x23AEC	
+0x2173	0x23C76	
+0x2175	0x24614	
+0x2176	0x215DC	
+0x2177	0x2471C	
+0x2178	0x2471D	
+0x2179	0x264D0	
+0x217A	0x26612	
+0x217B	0x26AF3	
+0x217C	0x28669	
+0x217E	0x28E11	
+0x2221	0x28E15	
+0x2222	0x28E10	
+0x2223	0x28E13	
+0x2224	0x200A4	
+0x2225	0x200A5	
+0x2226	0x201D0	
+0x2227	0x201BA	
+0x2228	0x201CB	
+0x2229	0x2057B	
+0x222A	0x20686	
+0x222B	0x206BB	
+0x222C	0x206BA	
+0x222D	0x206C3	
+0x222E	0x206B9	
+0x222F	0x206C0	
+0x2231	0x20839	
+0x2232	0x2083B	
+0x2233	0x20841	
+0x2234	0x208D1	
+0x2235	0x208CF	
+0x2236	0x208D2	
+0x2237	0x2092E	
+0x2238	0x2096E	
+0x2239	0x2098C	
+0x223A	0x20988	
+0x223B	0x20A35	
+0x223D	0x20A3A	
+0x223E	0x20A3B	
+0x223F	0x20A38	
+0x2240	0x20A39	
+0x2241	0x20B2E	
+0x2242	0x20B2C	
+0x2243	0x20BC8	
+0x2244	0x20BB5	
+0x2245	0x20BAD	
+0x2246	0x20BB0	
+0x2247	0x20BAB	
+0x2248	0x211B3	
+0x2249	0x211A9	
+0x224A	0x216BB	
+0x224B	0x216B9	
+0x224C	0x21B5A	
+0x224D	0x21BCD	
+0x224E	0x21C2B	
+0x224F	0x21D05	
+0x2252	0x21D51	
+0x2253	0x21D4B	
+0x2254	0x21FEA	
+0x2255	0x21FED	
+0x2256	0x22036	
+0x2257	0x22062	
+0x2258	0x22056	
+0x2259	0x22055	
+0x225A	0x22064	
+0x225B	0x22058	
+0x225D	0x221DA	
+0x225E	0x221D8	
+0x225F	0x223AD	
+0x2260	0x223AB	
+0x2261	0x224C0	
+0x2262	0x224C3	
+0x2263	0x225B3	
+0x2264	0x225B7	
+0x2265	0x225BA	
+0x2268	0x225C7	
+0x2269	0x225B5	
+0x226A	0x2298E	
+0x226B	0x22A73	
+0x226C	0x22A6C	
+0x226D	0x22A74	
+0x226E	0x2F8B4	
+0x226F	0x22A72	
+0x2270	0x22A71	
+0x2271	0x22A82	
+0x2272	0x22A70	
+0x2273	0x2313F	
+0x2274	0x233BA	
+0x2275	0x233B8	
+0x2276	0x239B7	
+0x2277	0x24723	
+0x2278	0x24721	
+0x2279	0x2472B	
+0x227A	0x24726	
+0x227B	0x24722	
+0x227C	0x24D25	
+0x227D	0x250E4	
+0x227E	0x25415	
+0x2321	0x264E4	
+0x2322	0x26633	
+0x2323	0x2662A	
+0x2324	0x26632	
+0x2325	0x26629	
+0x2326	0x26AFB	
+0x2327	0x2795B	
+0x2328	0x2795C	
+0x2329	0x27C28	
+0x232A	0x2866F	
+0x232B	0x2866D	
+0x232C	0x2866B	
+0x232D	0x2866E	
+0x232E	0x28E16	
+0x232F	0x20022	
+0x2330	0x20116	
+0x2331	0x20148	
+0x2332	0x201D8	
+0x2333	0x20200	
+0x2335	0x20480	
+0x2336	0x204E4	
+0x2338	0x204E7	
+0x2339	0x2050C	
+0x233A	0x20553	
+0x233B	0x205B7	
+0x233C	0x20AE8	
+0x233D	0x206D1	
+0x233E	0x206E5	
+0x233F	0x206D8	
+0x2340	0x206D6	
+0x2341	0x206DA	
+0x2342	0x206D9	
+0x2343	0x206D5	
+0x2344	0x206E6	
+0x2345	0x206D4	
+0x2346	0x206D3	
+0x2347	0x20844	
+0x2348	0x208D6	
+0x2349	0x208D7	
+0x234A	0x20913	
+0x234C	0x20970	
+0x234D	0x20992	
+0x234E	0x209DB	
+0x234F	0x209DA	
+0x2350	0x20A41	
+0x2351	0x20A43	
+0x2352	0x20B33	
+0x2353	0x20BF6	
+0x2354	0x20BD4	
+0x2355	0x20BDD	
+0x2356	0x20BD0	
+0x2357	0x20C04	
+0x2358	0x20BD9	
+0x2359	0x20BDB	
+0x235A	0x20C05	
+0x235B	0x20BD3	
+0x235C	0x20BE1	
+0x235D	0x21280	
+0x235E	0x21277	
+0x235F	0x21281	
+0x2360	0x21282	
+0x2361	0x21283	
+0x2362	0x2F85C	
+0x2363	0x21561	
+0x2364	0x21560	
+0x2365	0x216D8	
+0x2366	0x216D6	
+0x2367	0x216D7	
+0x2368	0x24605	
+0x2369	0x2194D	
+0x236A	0x21948	
+0x236B	0x21BD6	
+0x236C	0x21BCF	
+0x236D	0x21BD9	
+0x236E	0x21BD8	
+0x236F	0x21C3D	
+0x2371	0x21D54	
+0x2372	0x21D5B	
+0x2373	0x21D5C	
+0x2375	0x21D59	
+0x2376	0x21D58	
+0x2377	0x21D5A	
+0x2378	0x21D55	
+0x2379	0x21D56	
+0x237A	0x21D82	
+0x237B	0x21FF0	
+0x237C	0x2201C	
+0x237D	0x2206A	
+0x237E	0x22069	
+0x2421	0x22071	
+0x2422	0x22067	
+0x2423	0x2206C	
+0x2424	0x2206E	
+0x2425	0x22079	
+0x2426	0x2218B	
+0x2427	0x221B8	
+0x2428	0x221E7	
+0x2429	0x221E8	
+0x242A	0x221E4	
+0x242B	0x221E6	
+0x242C	0x221E5	
+0x242D	0x221F0	
+0x242E	0x22383	
+0x242F	0x223B7	
+0x2430	0x223BB	
+0x2431	0x223B9	
+0x2432	0x223C5	
+0x2433	0x22453	
+0x2434	0x224C4	
+0x2435	0x224C6	
+0x2436	0x224CB	
+0x2437	0x225C8	
+0x2438	0x2F89F	
+0x2439	0x225C9	
+0x243A	0x225DB	
+0x243B	0x22994	
+0x243C	0x22A95	
+0x243D	0x22A88	
+0x243E	0x22A8D	
+0x243F	0x22EEC	
+0x2440	0x22EEE	
+0x2441	0x22EF1	
+0x2442	0x2312E	
+0x2443	0x23149	
+0x2444	0x2335F	
+0x2445	0x233D1	
+0x2446	0x233CB	
+0x2447	0x23885	
+0x2449	0x2394A	
+0x244A	0x23947	
+0x244B	0x2394B	
+0x244C	0x239BB	
+0x244D	0x239C4	
+0x244F	0x23B02	
+0x2450	0x23C82	
+0x2451	0x23C91	
+0x2452	0x23C8F	
+0x2453	0x23C92	
+0x2454	0x2418F	
+0x2455	0x24191	
+0x2456	0x241B4	
+0x2457	0x24192	
+0x2458	0x244F4	
+0x2459	0x245AA	
+0x245A	0x24735	
+0x245B	0x24737	
+0x245C	0x2473D	
+0x245D	0x2473C	
+0x245E	0x2472F	
+0x245F	0x24730	
+0x2460	0x248F8	
+0x2461	0x248EF	
+0x2462	0x24B26	
+0x2464	0x24D26	
+0x2465	0x24D27	
+0x2466	0x24F41	
+0x2467	0x24FC6	
+0x2468	0x24FC7	
+0x2469	0x250EB	
+0x246A	0x250E8	
+0x246B	0x250EA	
+0x246C	0x2541A	
+0x246D	0x25419	
+0x246F	0x25923	
+0x2470	0x25924	
+0x2471	0x25E25	
+0x2472	0x26635	
+0x2473	0x26634	
+0x2474	0x26A07	
+0x2475	0x2721D	
+0x2476	0x277E1	
+0x2477	0x27BAB	
+0x2478	0x28460	
+0x2479	0x28677	
+0x247A	0x2867D	
+0x247C	0x28E1E	
+0x247D	0x28E1A	
+0x247E	0x28E1D	
+0x2521	0x2006B	
+0x2522	0x2012D	
+0x2523	0x2014C	
+0x2524	0x2022A	
+0x2526	0x20215	
+0x2527	0x2022C	
+0x2528	0x20206	
+0x2529	0x20208	
+0x252A	0x2020A	
+0x252C	0x20556	
+0x252D	0x20584	
+0x252F	0x205C6	
+0x2530	0x206F5	
+0x2531	0x20709	
+0x2532	0x206F8	
+0x2533	0x206E8	
+0x2534	0x206FB	
+0x2535	0x206E9	
+0x2536	0x206F6	
+0x2539	0x20852	
+0x253C	0x20854	
+0x253D	0x20851	
+0x253E	0x20939	
+0x253F	0x2093A	
+0x2540	0x20998	
+0x2541	0x20A4E	
+0x2543	0x20C36	
+0x2544	0x20C0C	
+0x2545	0x20C10	
+0x2546	0x20C32	
+0x2547	0x20C11	
+0x2548	0x20C18	
+0x2549	0x20C1C	
+0x254A	0x20C1A	
+0x254B	0x20C19	
+0x254C	0x20C0B	
+0x254D	0x20C0F	
+0x254E	0x20C1D	
+0x254F	0x20C21	
+0x2550	0x20C13	
+0x2551	0x20C1B	
+0x2552	0x20C15	
+0x2554	0x211D1	
+0x2555	0x211C8	
+0x2556	0x2128D	
+0x2557	0x212B5	
+0x255A	0x215F8	
+0x255B	0x216E0	
+0x255C	0x216E1	
+0x255E	0x216DE	
+0x255F	0x216FE	
+0x2560	0x216DC	
+0x2561	0x21701	
+0x2562	0x216FD	
+0x2563	0x21700	
+0x2564	0x219D7	
+0x2565	0x219D6	
+0x2566	0x219D9	
+0x2567	0x21B65	
+0x2568	0x21BD2	
+0x2569	0x21BDC	
+0x256A	0x21BE1	
+0x256B	0x21BDE	
+0x256C	0x21C42	
+0x256D	0x21C4B	
+0x256F	0x21D8E	
+0x2570	0x21D91	
+0x2571	0x21D8B	
+0x2572	0x21D90	
+0x2573	0x21D88	
+0x2574	0x21D89	
+0x2575	0x21D84	
+0x2576	0x21DAA	
+0x2577	0x2208D	
+0x2578	0x2208F	
+0x2579	0x2207D	
+0x257A	0x2207F	
+0x257B	0x2207B	
+0x257C	0x22080	
+0x257D	0x2207E	
+0x257E	0x22083	
+0x2621	0x22081	
+0x2622	0x22086	
+0x2623	0x2208A	
+0x2624	0x221BD	
+0x2625	0x221BE	
+0x2627	0x221F4	
+0x2628	0x221F3	
+0x2629	0x22202	
+0x262A	0x221F6	
+0x262B	0x221F5	
+0x262C	0x221F2	
+0x262D	0x22204	
+0x262E	0x2233D	
+0x262F	0x223C6	
+0x2630	0x22489	
+0x2631	0x224D4	
+0x2632	0x224D6	
+0x2633	0x224D2	
+0x2634	0x225FA	
+0x2635	0x22606	
+0x2636	0x2260C	
+0x2637	0x2260A	
+0x2638	0x2260F	
+0x2639	0x22A2F	
+0x263B	0x22AB7	
+0x263C	0x22ABE	
+0x263D	0x22ABC	
+0x263E	0x22AE2	
+0x263F	0x22F06	
+0x2640	0x22EF7	
+0x2641	0x22F07	
+0x2642	0x22EF6	
+0x2643	0x23B35	
+0x2644	0x2315F	
+0x2645	0x23165	
+0x2646	0x23164	
+0x2647	0x23161	
+0x2648	0x2315A	
+0x2649	0x2315D	
+0x264A	0x2F8D7	
+0x264B	0x233D7	
+0x264C	0x233D5	
+0x264D	0x233DE	
+0x264E	0x233E1	
+0x264F	0x233E0	
+0x2650	0x233D9	
+0x2652	0x233DA	
+0x2653	0x233DF	
+0x2654	0x233F6	
+0x2655	0x23403	
+0x2657	0x23893	
+0x2658	0x2388B	
+0x2659	0x23891	
+0x265A	0x23892	
+0x265B	0x2388A	
+0x265C	0x23889	
+0x265D	0x2388F	
+0x265E	0x23956	
+0x265F	0x23959	
+0x2660	0x239CA	
+0x2661	0x239CC	
+0x2663	0x239D0	
+0x2664	0x239CD	
+0x2665	0x239D6	
+0x2666	0x239CB	
+0x2667	0x23A83	
+0x2668	0x23A82	
+0x2669	0x23B06	
+0x266A	0x23B2A	
+0x266B	0x23B2C	
+0x266C	0x23B2B	
+0x266D	0x23B29	
+0x266E	0x23CBD	
+0x266F	0x23CB3	
+0x2670	0x23CBE	
+0x2671	0x23CC0	
+0x2672	0x23CB5	
+0x2673	0x23CB6	
+0x2674	0x2419D	
+0x2675	0x2419F	
+0x2676	0x24620	
+0x2678	0x2461E	
+0x2679	0x2461C	
+0x267A	0x24632	
+0x267B	0x2461F	
+0x267C	0x2462B	
+0x267D	0x24621	
+0x267E	0x24626	
+0x2721	0x24624	
+0x2722	0x2461D	
+0x2723	0x24627	
+0x2724	0x2475B	
+0x2725	0x24759	
+0x2726	0x24780	
+0x2727	0x24755	
+0x2728	0x24750	
+0x2729	0x2475A	
+0x272A	0x24756	
+0x272B	0x24763	
+0x272C	0x24752	
+0x272D	0x24758	
+0x272F	0x24739	
+0x2730	0x248F9	
+0x2731	0x24B28	
+0x2733	0x24BBC	
+0x2734	0x24BD6	
+0x2735	0x24C05	
+0x2736	0x24C20	
+0x2738	0x24D33	
+0x2739	0x24F46	
+0x273A	0x24F42	
+0x273B	0x24F43	
+0x273C	0x24F47	
+0x273D	0x24FCB	
+0x273E	0x25042	
+0x273F	0x25045	
+0x2740	0x250FD	
+0x2741	0x250F4	
+0x2742	0x250F9	
+0x2743	0x250FA	
+0x2744	0x2535E	
+0x2745	0x2541D	
+0x2747	0x25758	
+0x2748	0x25755	
+0x2749	0x25A57	
+0x274A	0x25A58	
+0x274B	0x25AD9	
+0x274C	0x25ADC	
+0x274D	0x25ADB	
+0x274E	0x25E27	
+0x274F	0x25F85	
+0x2750	0x25F87	
+0x2751	0x25F8A	
+0x2752	0x2628B	
+0x2753	0x2634F	
+0x2754	0x26530	
+0x2755	0x2652F	
+0x2756	0x26668	
+0x2757	0x26649	
+0x2759	0x26648	
+0x275A	0x2663F	
+0x275B	0x2664B	
+0x275C	0x2665C	
+0x275D	0x26646	
+0x275E	0x26640	
+0x275F	0x26A0D	
+0x2760	0x26B1B	
+0x2761	0x26B1D	
+0x2762	0x26B17	
+0x2764	0x26B22	
+0x2765	0x275A7	
+0x2766	0x27608	
+0x2767	0x27806	
+0x2768	0x2847D	
+0x276A	0x28463	
+0x276B	0x28464	
+0x276C	0x2847F	
+0x276D	0x2846B	
+0x276E	0x2847C	
+0x276F	0x28468	
+0x2770	0x28465	
+0x2771	0x2846A	
+0x2772	0x28698	
+0x2773	0x28699	
+0x2774	0x286AE	
+0x2775	0x28E2B	
+0x2776	0x28E2D	
+0x2777	0x28E31	
+0x2778	0x28E2E	
+0x2779	0x28E2F	
+0x277A	0x2006D	
+0x277B	0x20131	
+0x277C	0x2022D	
+0x277D	0x20239	
+0x277E	0x20238	
+0x2822	0x2023A	
+0x2823	0x20235	
+0x2824	0x20262	
+0x2825	0x204EA	
+0x2826	0x204EB	
+0x2827	0x20515	
+0x2828	0x205CC	
+0x2829	0x205C8	
+0x282A	0x205CD	
+0x282B	0x205DB	
+0x282C	0x205CB	
+0x282D	0x20711	
+0x282E	0x20726	
+0x282F	0x20862	
+0x2830	0x2085E	
+0x2831	0x20861	
+0x2832	0x20941	
+0x2833	0x2093F	
+0x2834	0x20975	
+0x2835	0x23965	
+0x2836	0x20B49	
+0x2837	0x209EB	
+0x2838	0x20A1A	
+0x2839	0x20A57	
+0x283A	0x20C6B	
+0x283B	0x20CA9	
+0x283C	0x20C54	
+0x283D	0x20C62	
+0x283E	0x20CAA	
+0x283F	0x20C58	
+0x2840	0x20C72	
+0x2841	0x20C63	
+0x2842	0x20C73	
+0x2843	0x20C8B	
+0x2844	0x20C8C	
+0x2845	0x20C5C	
+0x2846	0x20C51	
+0x2847	0x20C16	
+0x2848	0x20C60	
+0x2849	0x20C61	
+0x284A	0x20C5E	
+0x284B	0x20C5D	
+0x284C	0x20C64	
+0x284D	0x20C53	
+0x284E	0x20C5F	
+0x284F	0x20C5B	
+0x2850	0x20C6E	
+0x2851	0x20C55	
+0x2852	0x20C52	
+0x2853	0x20C68	
+0x2854	0x211D2	
+0x2855	0x211D6	
+0x2856	0x211D3	
+0x2857	0x212B8	
+0x2858	0x212BB	
+0x2859	0x212EB	
+0x285A	0x212E8	
+0x285B	0x212B6	
+0x285C	0x212EA	
+0x285D	0x212E7	
+0x285E	0x212E9	
+0x285F	0x21591	
+0x2860	0x21610	
+0x2861	0x2160E	
+0x2862	0x2160F	
+0x2863	0x2170B	
+0x2864	0x21703	
+0x2865	0x2172B	
+0x2866	0x21709	
+0x2867	0x21728	
+0x2868	0x2172C	
+0x2869	0x21725	
+0x286A	0x21727	
+0x286B	0x2170F	
+0x286C	0x219E9	
+0x286D	0x219EC	
+0x286F	0x21B27	
+0x2870	0x21B73	
+0x2871	0x21BE2	
+0x2872	0x21BE6	
+0x2873	0x2F876	
+0x2874	0x21C61	
+0x2875	0x21C51	
+0x2876	0x21D12	
+0x2877	0x21D0E	
+0x2878	0x21DAD	
+0x2879	0x21DAF	
+0x287A	0x21DB1	
+0x287B	0x21DD3	
+0x287C	0x22094	
+0x287D	0x22092	
+0x287E	0x22090	
+0x2921	0x2209D	
+0x2922	0x22093	
+0x2923	0x22095	
+0x2924	0x22098	
+0x2925	0x22097	
+0x2927	0x2F88A	
+0x2928	0x22207	
+0x2929	0x2220B	
+0x292A	0x22208	
+0x292B	0x223D9	
+0x292C	0x223D5	
+0x292D	0x224D7	
+0x292E	0x224DF	
+0x2930	0x224DE	
+0x2931	0x224E3	
+0x2932	0x224E2	
+0x2934	0x22647	
+0x2936	0x2263D	
+0x2937	0x22638	
+0x2938	0x22A44	
+0x2939	0x22A3A	
+0x293A	0x22AB8	
+0x293B	0x22B2A	
+0x293C	0x22B00	
+0x293D	0x22AF3	
+0x293E	0x22AF2	
+0x293F	0x22AEB	
+0x2940	0x22AFA	
+0x2941	0x22AED	
+0x2942	0x22AEC	
+0x2943	0x22AFF	
+0x2944	0x22AFB	
+0x2946	0x22B4E	
+0x2947	0x22AEF	
+0x2948	0x22AF7	
+0x2949	0x22F10	
+0x294A	0x22F11	
+0x294B	0x22F0C	
+0x294C	0x22F0B	
+0x294D	0x230DD	
+0x294E	0x23130	
+0x2950	0x2317A	
+0x2951	0x23177	
+0x2952	0x23328	
+0x2953	0x23327	
+0x2954	0x23365	
+0x2955	0x2340E	
+0x2956	0x2340B	
+0x2957	0x23441	
+0x2958	0x23413	
+0x2959	0x2340F	
+0x295A	0x23412	
+0x295B	0x23430	
+0x295C	0x238A0	
+0x295D	0x238A3	
+0x295E	0x2389E	
+0x295F	0x23897	
+0x2960	0x238A1	
+0x2961	0x2389D	
+0x2962	0x2389B	
+0x2963	0x23963	
+0x2964	0x239E3	
+0x2965	0x239E4	
+0x2966	0x239E6	
+0x2967	0x239E7	
+0x2968	0x239DD	
+0x296A	0x239EC	
+0x296B	0x239E5	
+0x296C	0x239F1	
+0x296D	0x23B3B	
+0x296E	0x23B39	
+0x296F	0x23B3A	
+0x2970	0x23B3C	
+0x2971	0x23B3D	
+0x2972	0x23B47	
+0x2973	0x23B3F	
+0x2974	0x23B44	
+0x2975	0x23C48	
+0x2976	0x23C49	
+0x2977	0x23C60	
+0x2978	0x23CE3	
+0x2979	0x23CE9	
+0x297A	0x23CF0	
+0x297D	0x23CF2	
+0x297E	0x23CED	
+0x2A21	0x23CEC	
+0x2A22	0x23CE6	
+0x2A23	0x23D16	
+0x2A25	0x241BC	
+0x2A26	0x241BE	
+0x2A27	0x241C0	
+0x2A28	0x241E0	
+0x2A29	0x24500	
+0x2A2A	0x24502	
+0x2A2B	0x244FE	
+0x2A2C	0x2455E	
+0x2A2D	0x245B3	
+0x2A2E	0x245B7	
+0x2A2F	0x2463A	
+0x2A30	0x24639	
+0x2A31	0x2463E	
+0x2A32	0x24638	
+0x2A33	0x2463D	
+0x2A34	0x2464F	
+0x2A35	0x2476E	
+0x2A36	0x2475F	
+0x2A37	0x24781	
+0x2A38	0x24782	
+0x2A39	0x24771	
+0x2A3A	0x2477B	
+0x2A3B	0x24779	
+0x2A3C	0x24777	
+0x2A3D	0x24773	
+0x2A3E	0x2476F	
+0x2A3F	0x24797	
+0x2A40	0x2477E	
+0x2A41	0x248FC	
+0x2A42	0x24911	
+0x2A43	0x24932	
+0x2A44	0x24931	
+0x2A45	0x24910	
+0x2A46	0x24AEC	
+0x2A47	0x24AEB	
+0x2A48	0x24B2C	
+0x2A49	0x24B2D	
+0x2A4A	0x24BDA	
+0x2A4B	0x24C2E	
+0x2A4C	0x24C2C	
+0x2A4D	0x24C2A	
+0x2A4E	0x24C33	
+0x2A4F	0x24C4B	
+0x2A50	0x24D18	
+0x2A51	0x24D42	
+0x2A52	0x24D3B	
+0x2A53	0x24D3F	
+0x2A54	0x24D41	
+0x2A55	0x24D43	
+0x2A56	0x24D3C	
+0x2A57	0x24F4C	
+0x2A58	0x24F4A	
+0x2A59	0x24F49	
+0x2A5A	0x24F56	
+0x2A5B	0x24FCF	
+0x2A5C	0x25047	
+0x2A5D	0x25048	
+0x2A5E	0x25046	
+0x2A5F	0x2511B	
+0x2A60	0x25111	
+0x2A61	0x25114	
+0x2A62	0x2511D	
+0x2A63	0x25117	
+0x2A64	0x2511E	
+0x2A65	0x2510B	
+0x2A66	0x2511C	
+0x2A67	0x25112	
+0x2A68	0x25116	
+0x2A69	0x2510D	
+0x2A6A	0x25115	
+0x2A6B	0x25113	
+0x2A6C	0x25118	
+0x2A6E	0x253AC	
+0x2A6F	0x25444	
+0x2A70	0x2542C	
+0x2A71	0x25445	
+0x2A72	0x25766	
+0x2A73	0x2576E	
+0x2A74	0x25765	
+0x2A75	0x25768	
+0x2A76	0x25784	
+0x2A77	0x25938	
+0x2A78	0x2593B	
+0x2A79	0x2593A	
+0x2A7A	0x2593F	
+0x2A7B	0x25ADF	
+0x2A7C	0x25ADD	
+0x2A7D	0x25ADE	
+0x2A7E	0x25AE2	
+0x2B22	0x25E2C	
+0x2B23	0x25E2F	
+0x2B24	0x25F8F	
+0x2B25	0x25F90	
+0x2B26	0x25F8C	
+0x2B27	0x25F93	
+0x2B28	0x26225	
+0x2B29	0x26288	
+0x2B2A	0x262A7	
+0x2B2B	0x263F7	
+0x2B2C	0x264BB	
+0x2B2D	0x26538	
+0x2B2E	0x26539	
+0x2B2F	0x26537	
+0x2B30	0x26614	
+0x2B31	0x2666E	
+0x2B32	0x2667B	
+0x2B34	0x2666C	
+0x2B35	0x2667F	
+0x2B36	0x26678	
+0x2B37	0x2667A	
+0x2B38	0x2666F	
+0x2B3A	0x268FE	
+0x2B3B	0x26B48	
+0x2B3C	0x26B4B	
+0x2B3D	0x26B41	
+0x2B3E	0x26B49	
+0x2B3F	0x26B3B	
+0x2B40	0x2722D	
+0x2B41	0x275E3	
+0x2B42	0x2761A	
+0x2B43	0x2760D	
+0x2B44	0x27613	
+0x2B45	0x27611	
+0x2B46	0x2761C	
+0x2B48	0x278B5	
+0x2B4A	0x27C29	
+0x2B4B	0x27CA1	
+0x2B4C	0x27D24	
+0x2B4D	0x27FBB	
+0x2B4E	0x282A1	
+0x2B4F	0x28483	
+0x2B50	0x2848D	
+0x2B51	0x28487	
+0x2B52	0x28485	
+0x2B53	0x2848A	
+0x2B54	0x284A3	
+0x2B55	0x28489	
+0x2B56	0x28484	
+0x2B57	0x284A2	
+0x2B58	0x286B1	
+0x2B59	0x286B0	
+0x2B5A	0x286AF	
+0x2B5B	0x286B6	
+0x2B5C	0x286C9	
+0x2B5D	0x286CA	
+0x2B5E	0x286C8	
+0x2B5F	0x286B4	
+0x2B60	0x28C59	
+0x2B61	0x28CC9	
+0x2B62	0x28E41	
+0x2B63	0x28E4C	
+0x2B65	0x28E45	
+0x2B66	0x28E5A	
+0x2B67	0x200B9	
+0x2B68	0x20294	
+0x2B69	0x2026E	
+0x2B6A	0x202A2	
+0x2B6B	0x20267	
+0x2B6D	0x202A3	
+0x2B6E	0x20276	
+0x2B6F	0x2026C	
+0x2B70	0x20264	
+0x2B71	0x202A5	
+0x2B72	0x20230	
+0x2B73	0x202A6	
+0x2B74	0x20269	
+0x2B75	0x202A4	
+0x2B76	0x20490	
+0x2B77	0x2055F	
+0x2B78	0x20560	
+0x2B79	0x205DA	
+0x2B7A	0x205D8	
+0x2B7B	0x205DD	
+0x2B7D	0x20759	
+0x2B7E	0x2075B	
+0x2C21	0x2075A	
+0x2C22	0x20739	
+0x2C23	0x20734	
+0x2C24	0x20744	
+0x2C25	0x20733	
+0x2C26	0x2073C	
+0x2C27	0x20758	
+0x2C28	0x2076A	
+0x2C29	0x2086F	
+0x2C2A	0x20872	
+0x2C2B	0x20870	
+0x2C2C	0x20871	
+0x2C2D	0x2086E	
+0x2C2E	0x208F0	
+0x2C2F	0x208EB	
+0x2C30	0x20949	
+0x2C31	0x2094C	
+0x2C32	0x209F5	
+0x2C33	0x20A20	
+0x2C34	0x20A6A	
+0x2C35	0x20A72	
+0x2C36	0x20B4B	
+0x2C37	0x20B5D	
+0x2C38	0x20C50	
+0x2C39	0x20CF9	
+0x2C3A	0x20CFA	
+0x2C3B	0x20CFB	
+0x2C3C	0x20D23	
+0x2C3D	0x20CB7	
+0x2C3E	0x20D22	
+0x2C3F	0x20CB5	
+0x2C40	0x20CC4	
+0x2C41	0x20CB4	
+0x2C42	0x20CEF	
+0x2C44	0x20CCD	
+0x2C45	0x20CF0	
+0x2C46	0x20CB8	
+0x2C47	0x20CCB	
+0x2C48	0x20CF1	
+0x2C49	0x20CBA	
+0x2C4A	0x20D03	
+0x2C4B	0x20CF8	
+0x2C4C	0x20CB6	
+0x2C4D	0x20CBC	
+0x2C4E	0x20CB3	
+0x2C4F	0x20D21	
+0x2C50	0x20CF7	
+0x2C51	0x20CC2	
+0x2C52	0x20CBE	
+0x2C53	0x20CC9	
+0x2C54	0x20CBD	
+0x2C55	0x20CCE	
+0x2C56	0x20CB9	
+0x2C57	0x20CC7	
+0x2C58	0x20CCA	
+0x2C59	0x20CCC	
+0x2C5A	0x20D26	
+0x2C5B	0x211E4	
+0x2C5C	0x211E0	
+0x2C5D	0x211F0	
+0x2C5E	0x212EC	
+0x2C5F	0x21324	
+0x2C60	0x21318	
+0x2C61	0x2132F	
+0x2C62	0x21325	
+0x2C63	0x21528	
+0x2C64	0x21522	
+0x2C65	0x2156A	
+0x2C66	0x20157	
+0x2C67	0x21594	
+0x2C68	0x21592	
+0x2C69	0x2159C	
+0x2C6A	0x21622	
+0x2C6B	0x21630	
+0x2C6C	0x2161D	
+0x2C6D	0x21623	
+0x2C6E	0x21735	
+0x2C6F	0x21733	
+0x2C70	0x2172F	
+0x2C71	0x2174D	
+0x2C72	0x21731	
+0x2C73	0x2175B	
+0x2C74	0x2175A	
+0x2C75	0x21732	
+0x2C76	0x2175C	
+0x2C77	0x21759	
+0x2C78	0x2175D	
+0x2C79	0x21969	
+0x2C7A	0x2196D	
+0x2C7B	0x22232	
+0x2C7D	0x21A0A	
+0x2C7E	0x21A20	
+0x2D21	0x21A1F	
+0x2D22	0x21A0D	
+0x2D23	0x21BE8	
+0x2D24	0x21BEC	
+0x2D25	0x21C77	
+0x2D26	0x21C70	
+0x2D27	0x21C71	
+0x2D28	0x21DF8	
+0x2D29	0x21DD6	
+0x2D2A	0x21DD9	
+0x2D2B	0x21DDE	
+0x2D2C	0x21DD5	
+0x2D2D	0x21DE1	
+0x2D2F	0x21DE2	
+0x2D30	0x21DDD	
+0x2D31	0x21DE0	
+0x2D32	0x21E0E	
+0x2D33	0x21E08	
+0x2D34	0x21DDC	
+0x2D35	0x21E0A	
+0x2D36	0x21E0C	
+0x2D37	0x220B4	
+0x2D38	0x220B1	
+0x2D39	0x220B6	
+0x2D3A	0x220BC	
+0x2D3B	0x2221D	
+0x2D3C	0x22224	
+0x2D3D	0x22219	
+0x2D3E	0x2221B	
+0x2D3F	0x22222	
+0x2D40	0x2221A	
+0x2D41	0x2221C	
+0x2D42	0x22221	
+0x2D43	0x223E6	
+0x2D44	0x223E4	
+0x2D45	0x223E7	
+0x2D46	0x223EA	
+0x2D48	0x2F89B	
+0x2D49	0x224F0	
+0x2D4A	0x224F5	
+0x2D4B	0x224EF	
+0x2D4C	0x22642	
+0x2D4D	0x2266E	
+0x2D4E	0x2263C	
+0x2D4F	0x22697	
+0x2D50	0x2268C	
+0x2D51	0x22681	
+0x2D52	0x22671	
+0x2D53	0x226CE	
+0x2D54	0x226BA	
+0x2D55	0x2267A	
+0x2D56	0x2267E	
+0x2D58	0x22672	
+0x2D59	0x226BB	
+0x2D5B	0x22673	
+0x2D5C	0x22682	
+0x2D5E	0x229BA	
+0x2D5F	0x229B8	
+0x2D60	0x22A4B	
+0x2D61	0x22A48	
+0x2D62	0x22B2B	
+0x2D63	0x22AF4	
+0x2D64	0x22B2C	
+0x2D65	0x22B42	
+0x2D66	0x22B48	
+0x2D67	0x22B44	
+0x2D68	0x22B45	
+0x2D69	0x22B3C	
+0x2D6A	0x22B37	
+0x2D6B	0x22B33	
+0x2D6C	0x22B41	
+0x2D6D	0x22B32	
+0x2D6E	0x22B87	
+0x2D6F	0x22F27	
+0x2D70	0x22F23	
+0x2D71	0x22F2D	
+0x2D72	0x22F1F	
+0x2D73	0x22F2C	
+0x2D74	0x22F28	
+0x2D75	0x23075	
+0x2D76	0x23074	
+0x2D77	0x230E7	
+0x2D78	0x23132	
+0x2D79	0x23131	
+0x2D7A	0x23199	
+0x2D7B	0x23196	
+0x2D7C	0x23198	
+0x2D7D	0x2319D	
+0x2D7E	0x23192	
+0x2E21	0x23194	
+0x2E22	0x23195	
+0x2E23	0x23197	
+0x2E24	0x266B9	
+0x2E26	0x23411	
+0x2E27	0x2343B	
+0x2E28	0x23479	
+0x2E29	0x23442	
+0x2E2A	0x23443	
+0x2E2C	0x23478	
+0x2E2D	0x238AC	
+0x2E2F	0x238B1	
+0x2E30	0x238B4	
+0x2E31	0x238B3	
+0x2E32	0x238AF	
+0x2E33	0x238AA	
+0x2E34	0x238B2	
+0x2E35	0x23968	
+0x2E36	0x239F2	
+0x2E37	0x239FE	
+0x2E38	0x239F8	
+0x2E39	0x239F9	
+0x2E3A	0x239FF	
+0x2E3B	0x239F5	
+0x2E3C	0x239F7	
+0x2E3D	0x239FD	
+0x2E3E	0x23A00	
+0x2E3F	0x23A88	
+0x2E40	0x23B6E	
+0x2E41	0x23B5D	
+0x2E42	0x23B63	
+0x2E43	0x23B60	
+0x2E44	0x23C61	
+0x2E45	0x23D37	
+0x2E46	0x23D71	
+0x2E47	0x23D23	
+0x2E48	0x23D22	
+0x2E49	0x23D1F	
+0x2E4A	0x23D25	
+0x2E4B	0x241FD	
+0x2E4C	0x24211	
+0x2E4D	0x24223	
+0x2E4E	0x241F0	
+0x2E4F	0x241EF	
+0x2E50	0x2450E	
+0x2E51	0x2450C	
+0x2E52	0x245BA	
+0x2E54	0x24652	
+0x2E55	0x24655	
+0x2E56	0x24653	
+0x2E57	0x24654	
+0x2E58	0x24651	
+0x2E59	0x24658	
+0x2E5A	0x247B0	
+0x2E5B	0x2479F	
+0x2E5D	0x247A1	
+0x2E5E	0x2479A	
+0x2E5F	0x247BE	
+0x2E60	0x247A0	
+0x2E61	0x24937	
+0x2E63	0x24AF1	
+0x2E64	0x24AF2	
+0x2E65	0x24B34	
+0x2E66	0x24B37	
+0x2E67	0x24B35	
+0x2E68	0x2238C	
+0x2E69	0x24BDF	
+0x2E6A	0x24C4C	
+0x2E6B	0x24C4E	
+0x2E6C	0x24C64	
+0x2E6D	0x24C63	
+0x2E6E	0x24C36	
+0x2E6F	0x24D58	
+0x2E70	0x24D68	
+0x2E71	0x24D5B	
+0x2E72	0x24D5F	
+0x2E73	0x24D59	
+0x2E74	0x24D65	
+0x2E75	0x24D60	
+0x2E76	0x24D5E	
+0x2E77	0x24FD5	
+0x2E78	0x24FD6	
+0x2E79	0x2504E	
+0x2E7A	0x25052	
+0x2E7B	0x25135	
+0x2E7C	0x25139	
+0x2E7D	0x25158	
+0x2E7E	0x25141	
+0x2F21	0x25157	
+0x2F22	0x25138	
+0x2F23	0x2513D	
+0x2F24	0x25132	
+0x2F25	0x25144	
+0x2F26	0x2F944	
+0x2F27	0x25363	
+0x2F28	0x25362	
+0x2F29	0x253B8	
+0x2F2A	0x253B0	
+0x2F2B	0x253B1	
+0x2F2C	0x2544D	
+0x2F2D	0x25463	
+0x2F2E	0x25470	
+0x2F2F	0x2544B	
+0x2F30	0x2544F	
+0x2F31	0x2544E	
+0x2F32	0x25453	
+0x2F33	0x25447	
+0x2F35	0x25454	
+0x2F36	0x25452	
+0x2F37	0x25459	
+0x2F38	0x2547E	
+0x2F39	0x2562B	
+0x2F3A	0x2562E	
+0x2F3B	0x2577F	
+0x2F3C	0x2577E	
+0x2F3D	0x25781	
+0x2F3E	0x25783	
+0x2F3F	0x25947	
+0x2F40	0x25954	
+0x2F41	0x2594D	
+0x2F42	0x2594C	
+0x2F43	0x2594B	
+0x2F44	0x25957	
+0x2F45	0x25A65	
+0x2F46	0x25A64	
+0x2F47	0x25A61	
+0x2F48	0x25A62	
+0x2F49	0x25AF0	
+0x2F4A	0x25AF3	
+0x2F4B	0x25AF9	
+0x2F4C	0x25AF4	
+0x2F4D	0x25AF5	
+0x2F4E	0x25AEF	
+0x2F4F	0x25AF8	
+0x2F50	0x25AFC	
+0x2F51	0x25AF7	
+0x2F52	0x25AFD	
+0x2F53	0x25B17	
+0x2F54	0x25E34	
+0x2F55	0x25E36	
+0x2F56	0x25E38	
+0x2F57	0x25FAF	
+0x2F58	0x25FAE	
+0x2F59	0x25FAC	
+0x2F5A	0x25FA2	
+0x2F5B	0x26228	
+0x2F5C	0x22EC2	
+0x2F5D	0x2629C	
+0x2F5E	0x262B3	
+0x2F5F	0x26290	
+0x2F60	0x26406	
+0x2F61	0x26404	
+0x2F62	0x2640B	
+0x2F63	0x26405	
+0x2F64	0x26540	
+0x2F65	0x2654F	
+0x2F66	0x266AB	
+0x2F67	0x2669D	
+0x2F68	0x266B8	
+0x2F69	0x266B2	
+0x2F6A	0x266D2	
+0x2F6B	0x266CF	
+0x2F6C	0x266A2	
+0x2F6E	0x266A5	
+0x2F6F	0x266A9	
+0x2F70	0x266A7	
+0x2F71	0x266D0	
+0x2F72	0x26902	
+0x2F73	0x269CF	
+0x2F74	0x269D0	
+0x2F75	0x26A16	
+0x2F76	0x26A19	
+0x2F77	0x26B75	
+0x2F78	0x26B71	
+0x2F79	0x26B91	
+0x2F7A	0x26B72	
+0x2F7B	0x26B8E	
+0x2F7C	0x26B6D	
+0x2F7D	0x26B88	
+0x2F7E	0x26B73	
+0x3022	0x26B81	
+0x3023	0x26B76	
+0x3024	0x26B7B	
+0x3025	0x26B7F	
+0x3026	0x26B90	
+0x3027	0x26B78	
+0x3028	0x2724B	
+0x3029	0x27248	
+0x302A	0x2725B	
+0x302B	0x27251	
+0x302C	0x2723D	
+0x302D	0x27240	
+0x302E	0x27246	
+0x302F	0x2724D	
+0x3030	0x2723B	
+0x3031	0x2724A	
+0x3032	0x27241	
+0x3033	0x2723E	
+0x3034	0x2724E	
+0x3035	0x275AC	
+0x3036	0x275E6	
+0x3037	0x275E9	
+0x3038	0x27629	
+0x303A	0x27633	
+0x303B	0x2762E	
+0x303C	0x2761E	
+0x303E	0x2F9C5	
+0x303F	0x27622	
+0x3040	0x27627	
+0x3041	0x277E7	
+0x3042	0x2780B	
+0x3043	0x27966	
+0x3044	0x27BAD	
+0x3045	0x27BAE	
+0x3047	0x27C2B	
+0x3048	0x27C2A	
+0x3049	0x27D2C	
+0x304A	0x27D2D	
+0x304D	0x27E8F	
+0x304E	0x27E93	
+0x304F	0x27FC6	
+0x3050	0x27FC5	
+0x3051	0x28215	
+0x3052	0x28213	
+0x3053	0x282B1	
+0x3054	0x282A9	
+0x3056	0x284A8	
+0x3057	0x284AB	
+0x3058	0x284BE	
+0x3059	0x284AC	
+0x305A	0x284A9	
+0x305B	0x284A6	
+0x305C	0x284C1	
+0x305D	0x286CC	
+0x305E	0x286D1	
+0x305F	0x286D3	
+0x3060	0x286E4	
+0x3061	0x286CB	
+0x3062	0x286E1	
+0x3063	0x286D2	
+0x3064	0x286E3	
+0x3065	0x286CF	
+0x3066	0x286D0	
+0x3067	0x286E5	
+0x3068	0x2870E	
+0x3069	0x28CCC	
+0x306A	0x28CCA	
+0x306B	0x28CCB	
+0x306C	0x28E5C	
+0x306D	0x28E61	
+0x306E	0x28E5D	
+0x306F	0x28E59	
+0x3070	0x29077	
+0x3071	0x29684	
+0x3072	0x20041	
+0x3073	0x200FD	
+0x3074	0x2011A	
+0x3075	0x20163	
+0x3076	0x202B6	
+0x3077	0x202B2	
+0x3078	0x202E9	
+0x3079	0x202E7	
+0x307A	0x202D6	
+0x307B	0x20330	
+0x307C	0x202EC	
+0x307D	0x202DD	
+0x307E	0x202E8	
+0x3121	0x202B0	
+0x3122	0x202B5	
+0x3123	0x202E1	
+0x3124	0x20498	
+0x3125	0x20499	
+0x3127	0x20593	
+0x3128	0x205E5	
+0x312A	0x20760	
+0x312B	0x2075E	
+0x312D	0x2087B	
+0x312E	0x208F1	
+0x312F	0x208F3	
+0x3130	0x20A7F	
+0x3131	0x2F838	
+0x3132	0x20B57	
+0x3133	0x20B58	
+0x3134	0x20D39	
+0x3135	0x20DA7	
+0x3136	0x20D35	
+0x3137	0x20D60	
+0x3138	0x20D51	
+0x3139	0x20D62	
+0x313A	0x20D42	
+0x313B	0x20D3C	
+0x313C	0x20D43	
+0x313D	0x20DAB	
+0x313E	0x20DA9	
+0x313F	0x20DB4	
+0x3140	0x20D79	
+0x3141	0x20D6A	
+0x3142	0x20D3B	
+0x3143	0x20DAA	
+0x3144	0x20D33	
+0x3145	0x20D37	
+0x3146	0x20D27	
+0x3147	0x20DA8	
+0x3148	0x20D70	
+0x3149	0x20D2F	
+0x314A	0x20D36	
+0x314B	0x20DB5	
+0x314C	0x20D30	
+0x314D	0x20D3A	
+0x314E	0x20D38	
+0x314F	0x20DB1	
+0x3150	0x20DAC	
+0x3151	0x20D2E	
+0x3152	0x20D75	
+0x3153	0x20DB0	
+0x3154	0x211F7	
+0x3155	0x21200	
+0x3156	0x211F1	
+0x3157	0x211F3	
+0x3158	0x21360	
+0x3159	0x21361	
+0x315A	0x21332	
+0x315B	0x2132D	
+0x315C	0x2134A	
+0x315D	0x2132A	
+0x315E	0x21567	
+0x315F	0x215A2	
+0x3160	0x215A3	
+0x3161	0x2159E	
+0x3162	0x215A4	
+0x3163	0x21644	
+0x3164	0x21632	
+0x3165	0x2179B	
+0x3166	0x21798	
+0x3167	0x21799	
+0x3168	0x2179A	
+0x3169	0x21766	
+0x316A	0x21762	
+0x316B	0x2176B	
+0x316C	0x24562	
+0x316D	0x21767	
+0x316E	0x21A3B	
+0x316F	0x21A23	
+0x3170	0x21A29	
+0x3171	0x21B7E	
+0x3172	0x21BF3	
+0x3174	0x21BF5	
+0x3176	0x21C80	
+0x3177	0x21C7E	
+0x3178	0x21C7C	
+0x3179	0x21C7F	
+0x317A	0x21C7D	
+0x317B	0x21C81	
+0x317C	0x21E25	
+0x317D	0x21E29	
+0x317E	0x21E17	
+0x3221	0x21E63	
+0x3222	0x21E67	
+0x3223	0x21E65	
+0x3224	0x21E2A	
+0x3225	0x21E68	
+0x3226	0x21E26	
+0x3227	0x21E64	
+0x3228	0x21E1B	
+0x3229	0x21E62	
+0x322A	0x21E69	
+0x322B	0x21FFE	
+0x322C	0x22044	
+0x322D	0x22042	
+0x322E	0x220B7	
+0x322F	0x220D2	
+0x3230	0x220D4	
+0x3231	0x220D7	
+0x3232	0x220DC	
+0x3233	0x220D1	
+0x3234	0x220D5	
+0x3235	0x220CD	
+0x3236	0x220D8	
+0x3237	0x2219A	
+0x3238	0x22242	
+0x3239	0x22235	
+0x323A	0x22258	
+0x323B	0x22234	
+0x323C	0x2223C	
+0x323D	0x2223B	
+0x323E	0x2223E	
+0x323F	0x2223D	
+0x3240	0x2225A	
+0x3241	0x22241	
+0x3242	0x22238	
+0x3243	0x22245	
+0x3244	0x22233	
+0x3245	0x22326	
+0x3247	0x223F7	
+0x3248	0x223EF	
+0x3249	0x223F0	
+0x324A	0x223EE	
+0x324B	0x2249D	
+0x324C	0x22506	
+0x324D	0x22511	
+0x324E	0x22508	
+0x324F	0x22502	
+0x3250	0x2250A	
+0x3251	0x22507	
+0x3252	0x22691	
+0x3253	0x2268E	
+0x3254	0x22685	
+0x3255	0x226E8	
+0x3256	0x22717	
+0x3257	0x226D4	
+0x3259	0x226C4	
+0x325A	0x226D5	
+0x325C	0x226D8	
+0x325D	0x22680	
+0x325E	0x226DE	
+0x325F	0x22742	
+0x3260	0x229C7	
+0x3261	0x229BF	
+0x3262	0x22B8D	
+0x3263	0x22B89	
+0x3264	0x22B90	
+0x3265	0x22B9A	
+0x3266	0x22BC8	
+0x3267	0x22B92	
+0x3268	0x22BA1	
+0x3269	0x22B84	
+0x326A	0x22F57	
+0x326B	0x22F47	
+0x326C	0x22F77	
+0x326D	0x22F3A	
+0x326E	0x22F50	
+0x326F	0x22F42	
+0x3270	0x22F43	
+0x3271	0x22FA3	
+0x3272	0x23077	
+0x3273	0x231B2	
+0x3274	0x231E2	
+0x3275	0x231BD	
+0x3276	0x23374	
+0x3277	0x23482	
+0x3278	0x234B8	
+0x327A	0x234BA	
+0x327B	0x234B9	
+0x327C	0x234BB	
+0x327D	0x23487	
+0x327E	0x2F8E4	
+0x3321	0x23483	
+0x3322	0x234B7	
+0x3323	0x20043	
+0x3324	0x238CE	
+0x3325	0x238BA	
+0x3326	0x23973	
+0x3327	0x23A09	
+0x3328	0x23A0A	
+0x3329	0x23A0B	
+0x332A	0x23A07	
+0x332B	0x23A05	
+0x332C	0x23A0E	
+0x332D	0x23A97	
+0x332E	0x23B77	
+0x332F	0x23B7B	
+0x3330	0x23B7A	
+0x3331	0x23B74	
+0x3332	0x23B79	
+0x3333	0x23D86	
+0x3334	0x23DF5	
+0x3335	0x23DA5	
+0x3336	0x23D9D	
+0x3337	0x23DBE	
+0x3338	0x23D96	
+0x3339	0x23DE1	
+0x333A	0x23DA4	
+0x333B	0x23DA1	
+0x333C	0x23DF6	
+0x333E	0x23D8D	
+0x333F	0x23D8B	
+0x3340	0x23D78	
+0x3341	0x23D98	
+0x3342	0x23E0A	
+0x3343	0x2425D	
+0x3344	0x24227	
+0x3345	0x2425F	
+0x3346	0x245C0	
+0x3347	0x245C1	
+0x3348	0x2466D	
+0x3349	0x2465E	
+0x334A	0x2468A	
+0x334B	0x24662	
+0x334C	0x24664	
+0x334E	0x247C0	
+0x334F	0x247CA	
+0x3350	0x247D1	
+0x3352	0x247C7	
+0x3353	0x247CE	
+0x3355	0x247C5	
+0x3356	0x24936	
+0x3357	0x24957	
+0x3358	0x24977	
+0x3359	0x24AF6	
+0x335A	0x24AF7	
+0x335B	0x24B55	
+0x335C	0x24B44	
+0x335D	0x24B3E	
+0x335E	0x24B42	
+0x335F	0x24B52	
+0x3360	0x24BE1	
+0x3361	0x24C08	
+0x3362	0x24C68	
+0x3363	0x24C67	
+0x3365	0x2F937	
+0x3366	0x24D7E	
+0x3367	0x24D93	
+0x3368	0x24D79	
+0x3369	0x24D81	
+0x336A	0x24D7D	
+0x336B	0x24D7B	
+0x336C	0x24D94	
+0x336E	0x24F66	
+0x336F	0x24FD9	
+0x3370	0x24FE0	
+0x3371	0x2F93E	
+0x3372	0x2505F	
+0x3373	0x2515F	
+0x3374	0x2515E	
+0x3375	0x25168	
+0x3377	0x25188	
+0x3378	0x2516A	
+0x3379	0x2516C	
+0x337A	0x25166	
+0x337B	0x25167	
+0x337C	0x25189	
+0x337D	0x25160	
+0x337E	0x25185	
+0x3421	0x2032A	
+0x3422	0x25368	
+0x3423	0x253B9	
+0x3424	0x253BA	
+0x3425	0x253BE	
+0x3426	0x2546F	
+0x3427	0x25480	
+0x3428	0x25474	
+0x3429	0x25481	
+0x342A	0x2547A	
+0x342B	0x2549C	
+0x342C	0x25473	
+0x342D	0x25482	
+0x342E	0x2547F	
+0x342F	0x254A7	
+0x3430	0x25479	
+0x3431	0x25478	
+0x3432	0x2547D	
+0x3433	0x254A8	
+0x3434	0x2547C	
+0x3435	0x25668	
+0x3436	0x2564E	
+0x3437	0x2579E	
+0x343A	0x25798	
+0x343C	0x25785	
+0x343D	0x2579C	
+0x343E	0x257C5	
+0x343F	0x2579A	
+0x3440	0x25968	
+0x3441	0x25965	
+0x3442	0x25967	
+0x3443	0x25961	
+0x3444	0x25960	
+0x3447	0x25A7B	
+0x3449	0x25B19	
+0x344A	0x25B0E	
+0x344B	0x25B31	
+0x344C	0x25B12	
+0x344D	0x25B10	
+0x344E	0x25B15	
+0x344F	0x25B3F	
+0x3450	0x25B1D	
+0x3451	0x25B1E	
+0x3452	0x25E4D	
+0x3453	0x25E48	
+0x3454	0x25E45	
+0x3455	0x25E42	
+0x3456	0x25E49	
+0x3457	0x25E4A	
+0x3458	0x25E47	
+0x345A	0x25E4C	
+0x345B	0x25FCD	
+0x345C	0x25FD5	
+0x345D	0x25FC4	
+0x345E	0x25FCA	
+0x345F	0x25FC3	
+0x3461	0x26229	
+0x3462	0x262B4	
+0x3463	0x2636D	
+0x3464	0x26366	
+0x3465	0x2636A	
+0x3466	0x26415	
+0x3467	0x264D3	
+0x3468	0x264EC	
+0x3469	0x26555	
+0x346B	0x266D6	
+0x346C	0x266D8	
+0x346D	0x26751	
+0x346E	0x266E0	
+0x346F	0x26703	
+0x3470	0x26704	
+0x3471	0x266DA	
+0x3472	0x266EA	
+0x3473	0x26702	
+0x3474	0x266D3	
+0x3475	0x266E4	
+0x3476	0x266E5	
+0x3477	0x2693B	
+0x3478	0x26966	
+0x3479	0x26A2C	
+0x347A	0x26A21	
+0x347B	0x26A26	
+0x347C	0x26AD4	
+0x347D	0x26AD5	
+0x347E	0x26AD9	
+0x3521	0x26BD5	
+0x3522	0x26BEB	
+0x3523	0x26BC5	
+0x3525	0x26C27	
+0x3526	0x26BF0	
+0x3527	0x26BB9	
+0x3528	0x26C18	
+0x3529	0x26BEE	
+0x352B	0x26BB7	
+0x352C	0x26BBB	
+0x352D	0x26BEF	
+0x352E	0x26BB8	
+0x352F	0x26BDF	
+0x3530	0x26BDA	
+0x3531	0x26BE3	
+0x3532	0x26BC9	
+0x3533	0x26BEC	
+0x3534	0x271A4	
+0x3536	0x271A3	
+0x3537	0x2725E	
+0x3538	0x27261	
+0x3539	0x27262	
+0x353A	0x27263	
+0x353B	0x2728E	
+0x353C	0x27269	
+0x353D	0x2726B	
+0x353E	0x27285	
+0x353F	0x2728D	
+0x3540	0x27264	
+0x3541	0x2726D	
+0x3542	0x2764C	
+0x3543	0x27649	
+0x3544	0x27647	
+0x3545	0x27648	
+0x3546	0x27642	
+0x3547	0x27645	
+0x3548	0x2765B	
+0x3549	0x2765D	
+0x354A	0x27646	
+0x354B	0x27813	
+0x354C	0x2781A	
+0x354D	0x2780E	
+0x354E	0x2780F	
+0x354F	0x2781B	
+0x3550	0x27812	
+0x3551	0x278C3	
+0x3552	0x278BE	
+0x3553	0x278BD	
+0x3554	0x27979	
+0x3555	0x2797C	
+0x3558	0x27980	
+0x3559	0x27975	
+0x355A	0x2799B	
+0x355C	0x27974	
+0x355F	0x22041	
+0x3560	0x22494	
+0x3561	0x27C30	
+0x3562	0x27CA7	
+0x3563	0x27CA5	
+0x3564	0x27CA4	
+0x3565	0x27D3A	
+0x3566	0x27E5B	
+0x3567	0x27E9F	
+0x3568	0x27EA8	
+0x3569	0x27EB3	
+0x356A	0x27EA1	
+0x356B	0x27EA7	
+0x356C	0x27EB2	
+0x356D	0x27E9D	
+0x356E	0x27EA3	
+0x356F	0x27EA2	
+0x3570	0x27FEF	
+0x3571	0x27FD9	
+0x3573	0x27FD5	
+0x3574	0x27FDD	
+0x3575	0x27FDA	
+0x3576	0x27FEE	
+0x3577	0x27FD7	
+0x3578	0x2821A	
+0x3579	0x28219	
+0x357A	0x28218	
+0x357B	0x282B3	
+0x357C	0x282BF	
+0x357D	0x282BB	
+0x357E	0x282C0	
+0x3621	0x282B9	
+0x3622	0x282B8	
+0x3623	0x282D5	
+0x3624	0x28411	
+0x3625	0x28410	
+0x3626	0x284C3	
+0x3627	0x284C2	
+0x3628	0x284E9	
+0x3629	0x284CD	
+0x362A	0x284E5	
+0x362B	0x284CA	
+0x362C	0x284C7	
+0x362D	0x284E8	
+0x362E	0x286F1	
+0x362F	0x2870C	
+0x3630	0x286EF	
+0x3631	0x286EE	
+0x3632	0x286F3	
+0x3633	0x2870D	
+0x3634	0x286F6	
+0x3635	0x286F0	
+0x3637	0x287F5	
+0x3638	0x287F4	
+0x3639	0x287F8	
+0x363A	0x287FE	
+0x363B	0x28911	
+0x363C	0x28922	
+0x363D	0x28942	
+0x363E	0x28C5C	
+0x363F	0x28C5A	
+0x3640	0x28C5D	
+0x3641	0x28CD1	
+0x3642	0x28CD0	
+0x3643	0x28E75	
+0x3644	0x28E7B	
+0x3645	0x28F89	
+0x3646	0x2944D	
+0x3647	0x29689	
+0x3648	0x29692	
+0x3649	0x2968C	
+0x364A	0x29688	
+0x364B	0x29867	
+0x364C	0x29868	
+0x364D	0x20321	
+0x364E	0x202F2	
+0x364F	0x20309	
+0x3650	0x202F8	
+0x3651	0x202F0	
+0x3652	0x202F3	
+0x3653	0x202F5	
+0x3654	0x202FB	
+0x3655	0x202F7	
+0x3656	0x202EF	
+0x3657	0x2030B	
+0x3658	0x204A2	
+0x3659	0x205F5	
+0x365A	0x205F3	
+0x365B	0x205F4	
+0x365C	0x205F2	
+0x365D	0x20698	
+0x365E	0x20768	
+0x365F	0x20780	
+0x3660	0x20785	
+0x3661	0x2078E	
+0x3662	0x2078F	
+0x3663	0x202F4	
+0x3664	0x20786	
+0x3665	0x207A4	
+0x3666	0x20886	
+0x3667	0x20889	
+0x3668	0x20887	
+0x3669	0x20885	
+0x366B	0x20888	
+0x366C	0x20AFF	
+0x366D	0x20B66	
+0x366F	0x20DC3	
+0x3671	0x20DC4	
+0x3672	0x20E3B	
+0x3673	0x20DE7	
+0x3674	0x20DF8	
+0x3675	0x20DFB	
+0x3677	0x20DBE	
+0x3678	0x20DC6	
+0x367B	0x20DFC	
+0x367C	0x20DC0	
+0x367D	0x20E33	
+0x367E	0x20DC9	
+0x3721	0x20DFE	
+0x3722	0x20DDA	
+0x3723	0x20DCC	
+0x3724	0x20DBB	
+0x3725	0x20DFD	
+0x3726	0x20DDF	
+0x3727	0x20DCD	
+0x3728	0x20DC2	
+0x3729	0x20DC8	
+0x372A	0x20E32	
+0x372B	0x20E2D	
+0x372C	0x20DD2	
+0x372D	0x20E31	
+0x372E	0x20DD3	
+0x372F	0x20E2E	
+0x3730	0x20DCF	
+0x3731	0x211FF	
+0x3732	0x21209	
+0x3733	0x211FC	
+0x3734	0x21372	
+0x3735	0x213AA	
+0x3736	0x213AB	
+0x3737	0x213A7	
+0x3738	0x2137B	
+0x3739	0x21376	
+0x373A	0x213A8	
+0x373B	0x213AC	
+0x373E	0x215AA	
+0x373F	0x20A03	
+0x3740	0x215AC	
+0x3741	0x215AD	
+0x3742	0x215AB	
+0x3743	0x21650	
+0x3744	0x21658	
+0x3745	0x217DD	
+0x3747	0x217AE	
+0x3748	0x217A2	
+0x3749	0x217AB	
+0x374A	0x217E3	
+0x374B	0x217AF	
+0x374C	0x217E0	
+0x374D	0x217E4	
+0x374F	0x217A7	
+0x3750	0x217AA	
+0x3751	0x217E2	
+0x3752	0x217E1	
+0x3753	0x217DF	
+0x3754	0x217AD	
+0x3755	0x217E5	
+0x3756	0x217D1	
+0x3757	0x217AC	
+0x3758	0x217D5	
+0x3759	0x217A3	
+0x375A	0x2179F	
+0x375B	0x21979	
+0x375C	0x21976	
+0x375D	0x21A43	
+0x375E	0x21A3D	
+0x375F	0x21A47	
+0x3760	0x21A44	
+0x3761	0x21A3F	
+0x3762	0x21A5B	
+0x3763	0x21B7F	
+0x3764	0x21C9A	
+0x3765	0x21C9C	
+0x3767	0x21D1E	
+0x3768	0x21E88	
+0x3769	0x21E6A	
+0x376A	0x21E76	
+0x376B	0x21E72	
+0x376C	0x21E70	
+0x376D	0x21E7E	
+0x376E	0x21E6C	
+0x376F	0x21E6F	
+0x3770	0x21E75	
+0x3771	0x21E77	
+0x3772	0x21E78	
+0x3773	0x21E8A	
+0x3774	0x21E79	
+0x3775	0x21E94	
+0x3776	0x22001	
+0x3777	0x22105	
+0x3778	0x220F1	
+0x3779	0x220EE	
+0x377A	0x220EF	
+0x377B	0x22104	
+0x377D	0x220FA	
+0x377E	0x22107	
+0x3821	0x220F4	
+0x3822	0x220F5	
+0x3823	0x2219C	
+0x3824	0x2226D	
+0x3825	0x22269	
+0x3826	0x22266	
+0x3827	0x22262	
+0x3828	0x22246	
+0x382A	0x22265	
+0x382B	0x2225D	
+0x382C	0x2225E	
+0x382D	0x2225F	
+0x382E	0x2238E	
+0x382F	0x22402	
+0x3830	0x22406	
+0x3831	0x22404	
+0x3832	0x22403	
+0x3833	0x22462	
+0x3834	0x22527	
+0x3835	0x22521	
+0x3836	0x22520	
+0x3837	0x22524	
+0x3838	0x22529	
+0x3839	0x22531	
+0x383A	0x22523	
+0x383B	0x22522	
+0x383C	0x226DC	
+0x383D	0x2274D	
+0x383E	0x226E5	
+0x383F	0x226D3	
+0x3840	0x226EE	
+0x3841	0x226E6	
+0x3843	0x22736	
+0x3844	0x22740	
+0x3845	0x2283F	
+0x3846	0x2273D	
+0x3847	0x22744	
+0x3849	0x2275F	
+0x384A	0x22729	
+0x384B	0x22749	
+0x384C	0x2278A	
+0x384D	0x2272A	
+0x384E	0x22787	
+0x384F	0x2274C	
+0x3850	0x22731	
+0x3851	0x22748	
+0x3852	0x2272B	
+0x3853	0x2273B	
+0x3854	0x22741	
+0x3855	0x226C9	
+0x3856	0x22734	
+0x3857	0x22753	
+0x3858	0x22735	
+0x3859	0x22747	
+0x385A	0x22738	
+0x385B	0x229D1	
+0x385C	0x229D2	
+0x385D	0x22A51	
+0x385E	0x22A55	
+0x385F	0x22A52	
+0x3860	0x22A53	
+0x3861	0x22B8F	
+0x3862	0x22BF4	
+0x3863	0x22C47	
+0x3864	0x22C0D	
+0x3865	0x22C1C	
+0x3866	0x22BFB	
+0x3867	0x22C19	
+0x3868	0x22BF7	
+0x3869	0x22BF9	
+0x386A	0x22BF5	
+0x386B	0x22BE9	
+0x386C	0x22C0A	
+0x386D	0x22BEE	
+0x386E	0x22C0B	
+0x386F	0x22BFD	
+0x3870	0x22C06	
+0x3871	0x22C02	
+0x3872	0x22C16	
+0x3873	0x22C18	
+0x3874	0x22BF0	
+0x3875	0x22ED4	
+0x3876	0x22F66	
+0x3877	0x22F6A	
+0x3878	0x22F75	
+0x3879	0x22F76	
+0x387A	0x22F80	
+0x387B	0x22F6D	
+0x387D	0x22F69	
+0x387E	0x22F67	
+0x3921	0x22F68	
+0x3922	0x22F5D	
+0x3923	0x230A4	
+0x3924	0x230FE	
+0x3925	0x230FD	
+0x3926	0x231EC	
+0x3927	0x231E9	
+0x3928	0x23221	
+0x3929	0x231EB	
+0x392A	0x231E7	
+0x392B	0x231F2	
+0x392C	0x23220	
+0x392D	0x2337A	
+0x392E	0x2352D	
+0x392F	0x2352E	
+0x3930	0x234CA	
+0x3931	0x2352F	
+0x3932	0x234C8	
+0x3934	0x234CB	
+0x3935	0x234C3	
+0x3936	0x23484	
+0x3937	0x234D2	
+0x3938	0x234C6	
+0x393A	0x234CF	
+0x393B	0x234D5	
+0x393C	0x234D4	
+0x393D	0x234DD	
+0x393E	0x2352B	
+0x393F	0x235A3	
+0x3940	0x234DB	
+0x3941	0x2352C	
+0x3942	0x23513	
+0x3944	0x238D1	
+0x3945	0x238CC	
+0x3946	0x238D5	
+0x3947	0x238C9	
+0x3948	0x238CF	
+0x3949	0x238D2	
+0x394A	0x2397B	
+0x394B	0x2397C	
+0x394C	0x23A23	
+0x394D	0x23A1D	
+0x394E	0x23A1C	
+0x394F	0x23A1E	
+0x3950	0x23A22	
+0x3951	0x23A24	
+0x3952	0x23A20	
+0x3953	0x23A18	
+0x3954	0x23A21	
+0x3955	0x23B88	
+0x3956	0x23B8A	
+0x3957	0x23B94	
+0x3958	0x23B8F	
+0x3959	0x23B8E	
+0x395A	0x23B90	
+0x395C	0x23BA7	
+0x395D	0x23C64	
+0x395F	0x23E18	
+0x3960	0x23E14	
+0x3961	0x23E1D	
+0x3962	0x23E05	
+0x3963	0x23DFF	
+0x3964	0x23E1B	
+0x3965	0x23E1A	
+0x3966	0x23E19	
+0x3967	0x23E03	
+0x3968	0x23E0E	
+0x3969	0x23E47	
+0x396A	0x23E04	
+0x396B	0x23E5A	
+0x396C	0x23E07	
+0x396D	0x23E20	
+0x396E	0x2426A	
+0x396F	0x24266	
+0x3970	0x2427A	
+0x3971	0x24265	
+0x3972	0x242AF	
+0x3973	0x245CD	
+0x3974	0x245CF	
+0x3975	0x245D1	
+0x3976	0x245CE	
+0x3977	0x2465F	
+0x3978	0x24677	
+0x3979	0x24674	
+0x397A	0x24688	
+0x397B	0x24675	
+0x397C	0x24689	
+0x397D	0x24672	
+0x397E	0x247C6	
+0x3A21	0x247EA	
+0x3A22	0x247E0	
+0x3A23	0x24807	
+0x3A24	0x247E6	
+0x3A25	0x247E5	
+0x3A26	0x247DD	
+0x3A27	0x247E3	
+0x3A28	0x247DA	
+0x3A29	0x249AE	
+0x3A2A	0x2497E	
+0x3A2B	0x2497D	
+0x3A2C	0x2497F	
+0x3A2E	0x249D9	
+0x3A2F	0x24AFA	
+0x3A30	0x24AFB	
+0x3A31	0x24B4D	
+0x3A32	0x24B54	
+0x3A33	0x24B51	
+0x3A34	0x24B50	
+0x3A35	0x24D98	
+0x3A36	0x24D95	
+0x3A37	0x24D9D	
+0x3A38	0x24DC1	
+0x3A39	0x24D9A	
+0x3A3A	0x24D9B	
+0x3A3C	0x24D9C	
+0x3A3D	0x24DD7	
+0x3A3E	0x24DA4	
+0x3A3F	0x24D96	
+0x3A40	0x24DA0	
+0x3A41	0x24F31	
+0x3A42	0x24FE9	
+0x3A43	0x2506E	
+0x3A44	0x2519A	
+0x3A45	0x251A5	
+0x3A46	0x25194	
+0x3A47	0x251A6	
+0x3A48	0x25199	
+0x3A49	0x2518B	
+0x3A4A	0x25198	
+0x3A4B	0x25191	
+0x3A4C	0x2518C	
+0x3A4D	0x251A1	
+0x3A4E	0x251A3	
+0x3A4F	0x251C6	
+0x3A50	0x2536F	
+0x3A51	0x2536D	
+0x3A52	0x2536A	
+0x3A53	0x2536C	
+0x3A54	0x25371	
+0x3A55	0x2536E	
+0x3A56	0x253DF	
+0x3A57	0x254AC	
+0x3A58	0x254AA	
+0x3A5A	0x254B5	
+0x3A5B	0x254AD	
+0x3A5C	0x254B2	
+0x3A5D	0x254B3	
+0x3A5E	0x254AB	
+0x3A5F	0x254B6	
+0x3A60	0x254C7	
+0x3A61	0x254C6	
+0x3A62	0x2566C	
+0x3A63	0x25670	
+0x3A64	0x257B3	
+0x3A66	0x2598C	
+0x3A67	0x25981	
+0x3A68	0x25983	
+0x3A69	0x2597D	
+0x3A6A	0x25985	
+0x3A6B	0x25990	
+0x3A6C	0x259A2	
+0x3A6D	0x2598D	
+0x3A6E	0x2598F	
+0x3A6F	0x2597E	
+0x3A70	0x2598A	
+0x3A71	0x2597F	
+0x3A72	0x25976	
+0x3A73	0x25987	
+0x3A74	0x25978	
+0x3A75	0x25A80	
+0x3A76	0x25A82	
+0x3A77	0x25A81	
+0x3A78	0x25A83	
+0x3A79	0x25B5A	
+0x3A7A	0x25B34	
+0x3A7B	0x25B2C	
+0x3A7C	0x25B2A	
+0x3A7D	0x25B40	
+0x3A7E	0x25B2D	
+0x3B21	0x25B33	
+0x3B22	0x25B2B	
+0x3B23	0x25B4B	
+0x3B25	0x25B3C	
+0x3B26	0x25E5A	
+0x3B27	0x25E77	
+0x3B28	0x25E60	
+0x3B29	0x25FFA	
+0x3B2A	0x25FF9	
+0x3B2B	0x25FFC	
+0x3B2D	0x25FF5	
+0x3B2E	0x25FE8	
+0x3B2F	0x26009	
+0x3B30	0x25FE7	
+0x3B31	0x25FE6	
+0x3B32	0x25FE9	
+0x3B33	0x26232	
+0x3B34	0x2622C	
+0x3B35	0x262BD	
+0x3B36	0x262BC	
+0x3B37	0x2637A	
+0x3B38	0x2637E	
+0x3B39	0x26379	
+0x3B3B	0x26423	
+0x3B3C	0x26430	
+0x3B3D	0x26428	
+0x3B3E	0x264D4	
+0x3B3F	0x26ACE	
+0x3B40	0x264F1	
+0x3B41	0x264F0	
+0x3B42	0x26560	
+0x3B43	0x26565	
+0x3B44	0x266A8	
+0x3B45	0x2670A	
+0x3B46	0x2671B	
+0x3B47	0x26712	
+0x3B48	0x26707	
+0x3B49	0x2674F	
+0x3B4A	0x2670E	
+0x3B4B	0x26752	
+0x3B4C	0x26716	
+0x3B4E	0x26753	
+0x3B4F	0x26754	
+0x3B50	0x2F984	
+0x3B51	0x26756	
+0x3B52	0x2696D	
+0x3B53	0x26972	
+0x3B54	0x26A2F	
+0x3B55	0x26C2A	
+0x3B57	0x26C63	
+0x3B58	0x26C84	
+0x3B59	0x26CAF	
+0x3B5A	0x26C45	
+0x3B5B	0x26C70	
+0x3B5C	0x26C56	
+0x3B5D	0x26C16	
+0x3B5E	0x26C3D	
+0x3B5F	0x26C38	
+0x3B60	0x26C6F	
+0x3B61	0x26C77	
+0x3B62	0x26C2E	
+0x3B63	0x26C31	
+0x3B64	0x26C4C	
+0x3B65	0x26C5F	
+0x3B66	0x26C75	
+0x3B67	0x26C39	
+0x3B68	0x26C3A	
+0x3B69	0x26C2C	
+0x3B6A	0x26C2D	
+0x3B6B	0x26C3F	
+0x3B6C	0x26C2F	
+0x3B6D	0x26C30	
+0x3B6E	0x26C3E	
+0x3B71	0x271B2	
+0x3B72	0x272B7	
+0x3B73	0x2728F	
+0x3B75	0x27296	
+0x3B76	0x2729E	
+0x3B77	0x27297	
+0x3B78	0x27295	
+0x3B79	0x272A5	
+0x3B7A	0x27298	
+0x3B7C	0x272A3	
+0x3B7D	0x2729A	
+0x3B7E	0x272AD	
+0x3C21	0x272A6	
+0x3C22	0x272B6	
+0x3C23	0x27299	
+0x3C24	0x272AF	
+0x3C25	0x272AC	
+0x3C27	0x2729F	
+0x3C28	0x27294	
+0x3C29	0x275EB	
+0x3C2A	0x2766F	
+0x3C2B	0x2766D	
+0x3C2C	0x2767E	
+0x3C2D	0x2766C	
+0x3C2E	0x27661	
+0x3C2F	0x27663	
+0x3C30	0x2766B	
+0x3C31	0x2765E	
+0x3C32	0x2763E	
+0x3C33	0x27664	
+0x3C34	0x276AD	
+0x3C36	0x27820	
+0x3C37	0x278D1	
+0x3C38	0x278D5	
+0x3C39	0x279AE	
+0x3C3A	0x279AF	
+0x3C3B	0x2799F	
+0x3C3C	0x279A8	
+0x3C3D	0x279CA	
+0x3C3E	0x27BE1	
+0x3C3F	0x27C39	
+0x3C40	0x27C38	
+0x3C41	0x27C3B	
+0x3C42	0x27CAD	
+0x3C43	0x27CB5	
+0x3C44	0x27CAF	
+0x3C45	0x27CB1	
+0x3C46	0x27CAE	
+0x3C47	0x27CB4	
+0x3C48	0x27CB0	
+0x3C49	0x27D4B	
+0x3C4A	0x27D51	
+0x3C4B	0x27D4C	
+0x3C4D	0x27D60	
+0x3C4E	0x27EBE	
+0x3C4F	0x27EB9	
+0x3C50	0x27EB7	
+0x3C51	0x27EB6	
+0x3C53	0x27EBD	
+0x3C54	0x27EB8	
+0x3C55	0x27EC1	
+0x3C56	0x27FF7	
+0x3C57	0x27FF3	
+0x3C58	0x27FF4	
+0x3C59	0x27FFB	
+0x3C5A	0x27FFD	
+0x3C5B	0x27FF5	
+0x3C5D	0x27FFA	
+0x3C5E	0x28014	
+0x3C60	0x27FF2	
+0x3C61	0x27FFC	
+0x3C62	0x28000	
+0x3C64	0x2822B	
+0x3C65	0x28229	
+0x3C66	0x2822E	
+0x3C68	0x282D7	
+0x3C69	0x282DB	
+0x3C6A	0x282D9	
+0x3C6B	0x282D8	
+0x3C6C	0x282E6	
+0x3C6D	0x282D6	
+0x3C6E	0x282D1	
+0x3C6F	0x282E7	
+0x3C70	0x282D0	
+0x3C71	0x282DC	
+0x3C72	0x284ED	
+0x3C73	0x2851A	
+0x3C74	0x28519	
+0x3C75	0x28516	
+0x3C76	0x284EC	
+0x3C77	0x284EF	
+0x3C78	0x284EE	
+0x3C79	0x284F4	
+0x3C7A	0x2852F	
+0x3C7B	0x28730	
+0x3C7C	0x28719	
+0x3C7D	0x28718	
+0x3C7E	0x28711	
+0x3D21	0x28716	
+0x3D22	0x28712	
+0x3D23	0x28710	
+0x3D24	0x28714	
+0x3D25	0x2880C	
+0x3D26	0x2880D	
+0x3D27	0x28910	
+0x3D28	0x28929	
+0x3D29	0x28928	
+0x3D2A	0x28C65	
+0x3D2B	0x28C66	
+0x3D2C	0x28CDE	
+0x3D2D	0x28CDF	
+0x3D2E	0x28CE0	
+0x3D2F	0x28CD9	
+0x3D30	0x28CDB	
+0x3D31	0x28CD8	
+0x3D32	0x28CE3	
+0x3D33	0x28CD7	
+0x3D34	0x28EA6	
+0x3D35	0x28EA7	
+0x3D36	0x28EBF	
+0x3D37	0x28EA8	
+0x3D38	0x28E9F	
+0x3D39	0x28EA1	
+0x3D3A	0x28EA2	
+0x3D3B	0x28EAD	
+0x3D3C	0x28EA3	
+0x3D3D	0x28EA0	
+0x3D3E	0x29083	
+0x3D3F	0x29085	
+0x3D40	0x29082	
+0x3D41	0x29084	
+0x3D42	0x291EE	
+0x3D43	0x2925D	
+0x3D44	0x29392	
+0x3D45	0x29455	
+0x3D46	0x29453	
+0x3D47	0x2F9FC	
+0x3D48	0x29451	
+0x3D49	0x29452	
+0x3D4A	0x29450	
+0x3D4B	0x2959D	
+0x3D4C	0x29687	
+0x3D4D	0x29697	
+0x3D4E	0x2969B	
+0x3D4F	0x2969D	
+0x3D50	0x29869	
+0x3D51	0x29A11	
+0x3D53	0x29C7A	
+0x3D55	0x23244	
+0x3D56	0x200C6	
+0x3D57	0x20340	
+0x3D58	0x2032E	
+0x3D59	0x20368	
+0x3D5A	0x2032D	
+0x3D5B	0x20334	
+0x3D5C	0x20332	
+0x3D5D	0x20369	
+0x3D5E	0x20331	
+0x3D5F	0x2036A	
+0x3D60	0x2033E	
+0x3D61	0x2036F	
+0x3D62	0x20375	
+0x3D63	0x204F6	
+0x3D64	0x20520	
+0x3D65	0x20528	
+0x3D66	0x20567	
+0x3D67	0x205FB	
+0x3D68	0x205FE	
+0x3D69	0x205FC	
+0x3D6A	0x205FD	
+0x3D6B	0x205FF	
+0x3D6C	0x205FA	
+0x3D6D	0x207AC	
+0x3D6E	0x207AF	
+0x3D6F	0x207B1	
+0x3D71	0x207BF	
+0x3D72	0x207BE	
+0x3D73	0x207A7	
+0x3D74	0x207AA	
+0x3D75	0x20894	
+0x3D76	0x20893	
+0x3D77	0x20899	
+0x3D79	0x208FA	
+0x3D7A	0x20956	
+0x3D7B	0x20A22	
+0x3D7C	0x20A91	
+0x3D7D	0x20A92	
+0x3D7E	0x20B08	
+0x3E21	0x20B06	
+0x3E22	0x20DD6	
+0x3E23	0x20E37	
+0x3E24	0x20E4B	
+0x3E25	0x20ECE	
+0x3E26	0x20ED0	
+0x3E27	0x20E39	
+0x3E28	0x20E64	
+0x3E29	0x20ECF	
+0x3E2A	0x20E46	
+0x3E2B	0x20E66	
+0x3E2C	0x20E56	
+0x3E2D	0x20E43	
+0x3E2E	0x20E4A	
+0x3E2F	0x20E58	
+0x3E30	0x20E65	
+0x3E31	0x20E5A	
+0x3E32	0x20E5B	
+0x3E33	0x20E55	
+0x3E34	0x20E50	
+0x3E35	0x20E4C	
+0x3E36	0x20ECD	
+0x3E37	0x20E51	
+0x3E38	0x20E47	
+0x3E3A	0x20E53	
+0x3E3B	0x20E62	
+0x3E3C	0x20ECC	
+0x3E3E	0x20E7F	
+0x3E3F	0x20E4D	
+0x3E40	0x2120A	
+0x3E41	0x2120C	
+0x3E42	0x2120F	
+0x3E43	0x213BB	
+0x3E44	0x213B9	
+0x3E45	0x213EB	
+0x3E46	0x213AE	
+0x3E47	0x213C1	
+0x3E48	0x213EA	
+0x3E49	0x213BE	
+0x3E4A	0x213BF	
+0x3E4B	0x213BA	
+0x3E4C	0x213B7	
+0x3E4D	0x213B3	
+0x3E4E	0x213E9	
+0x3E4F	0x2156E	
+0x3E50	0x215AF	
+0x3E51	0x215B3	
+0x3E52	0x215B2	
+0x3E53	0x21668	
+0x3E54	0x21669	
+0x3E55	0x2166A	
+0x3E56	0x217DE	
+0x3E57	0x217EB	
+0x3E58	0x21811	
+0x3E59	0x217ED	
+0x3E5A	0x217E9	
+0x3E5B	0x217F7	
+0x3E5C	0x217F4	
+0x3E5D	0x217EA	
+0x3E5E	0x21812	
+0x3E5F	0x217E8	
+0x3E60	0x21813	
+0x3E61	0x2198E	
+0x3E62	0x21986	
+0x3E63	0x21A63	
+0x3E64	0x21A65	
+0x3E65	0x21B99	
+0x3E66	0x21CC2	
+0x3E67	0x21CAE	
+0x3E68	0x21CB0	
+0x3E69	0x21CAD	
+0x3E6A	0x21EB4	
+0x3E6B	0x21ED1	
+0x3E6C	0x21EAD	
+0x3E6E	0x21EBD	
+0x3E6F	0x21EB7	
+0x3E70	0x21EAB	
+0x3E71	0x21EAF	
+0x3E72	0x21EC1	
+0x3E73	0x21EB5	
+0x3E74	0x2210F	
+0x3E75	0x2210E	
+0x3E76	0x2211C	
+0x3E77	0x22113	
+0x3E78	0x2210A	
+0x3E79	0x2211E	
+0x3E7A	0x22114	
+0x3E7B	0x2211A	
+0x3E7C	0x221CB	
+0x3E7D	0x22287	
+0x3E7E	0x22293	
+0x3F22	0x22284	
+0x3F23	0x22285	
+0x3F24	0x22292	
+0x3F25	0x22280	
+0x3F26	0x2232B	
+0x3F27	0x22363	
+0x3F28	0x2240A	
+0x3F2A	0x22466	
+0x3F2B	0x22534	
+0x3F2C	0x22533	
+0x3F2D	0x2254D	
+0x3F2E	0x22789	
+0x3F2F	0x22757	
+0x3F31	0x2274A	
+0x3F33	0x22739	
+0x3F34	0x2273F	
+0x3F35	0x22790	
+0x3F36	0x2278F	
+0x3F37	0x227B2	
+0x3F38	0x2279F	
+0x3F39	0x22795	
+0x3F3A	0x227A1	
+0x3F3B	0x2279C	
+0x3F3C	0x2278E	
+0x3F3D	0x227A0	
+0x3F3E	0x227AE	
+0x3F3F	0x22796	
+0x3F40	0x227CA	
+0x3F41	0x227AC	
+0x3F43	0x227A6	
+0x3F44	0x22797	
+0x3F45	0x22793	
+0x3F46	0x203B6	
+0x3F47	0x229D6	
+0x3F48	0x229E0	
+0x3F49	0x229D8	
+0x3F4A	0x22A56	
+0x3F4B	0x22C6E	
+0x3F4C	0x22C7E	
+0x3F4D	0x22C74	
+0x3F4E	0x22C77	
+0x3F4F	0x22C80	
+0x3F50	0x22C7A	
+0x3F51	0x22C6B	
+0x3F52	0x22C5F	
+0x3F53	0x22C76	
+0x3F54	0x22CB0	
+0x3F55	0x22C63	
+0x3F56	0x22F92	
+0x3F57	0x22F82	
+0x3F58	0x22F9D	
+0x3F59	0x22F94	
+0x3F5A	0x22F83	
+0x3F5B	0x22F8B	
+0x3F5C	0x22F84	
+0x3F5D	0x23057	
+0x3F5E	0x23084	
+0x3F5F	0x230B5	
+0x3F60	0x23109	
+0x3F61	0x231E6	
+0x3F63	0x23225	
+0x3F64	0x23251	
+0x3F65	0x2333E	
+0x3F66	0x2F8DA	
+0x3F67	0x23385	
+0x3F68	0x2353F	
+0x3F69	0x23542	
+0x3F6A	0x23538	
+0x3F6B	0x2353A	
+0x3F6C	0x2354E	
+0x3F6D	0x23545	
+0x3F6E	0x23539	
+0x3F6F	0x23537	
+0x3F70	0x23544	
+0x3F71	0x2F8E7	
+0x3F72	0x235A4	
+0x3F73	0x2353D	
+0x3F74	0x23541	
+0x3F75	0x238DF	
+0x3F76	0x238DE	
+0x3F77	0x238CA	
+0x3F78	0x238E9	
+0x3F79	0x238E2	
+0x3F7A	0x238E0	
+0x3F7B	0x23989	
+0x3F7C	0x23987	
+0x3F7D	0x23A32	
+0x3F7E	0x23A33	
+0x4021	0x23AAC	
+0x4022	0x23AF9	
+0x4023	0x23B0D	
+0x4024	0x23BB9	
+0x4025	0x23E5E	
+0x4026	0x23E6A	
+0x4028	0x23E81	
+0x4029	0x23E69	
+0x402A	0x23EAC	
+0x402B	0x23E80	
+0x402C	0x23E75	
+0x402D	0x23E71	
+0x402E	0x23E76	
+0x402F	0x23E6F	
+0x4030	0x242B6	
+0x4031	0x24303	
+0x4032	0x242BF	
+0x4033	0x24301	
+0x4034	0x242B2	
+0x4035	0x242C4	
+0x4036	0x245DB	
+0x4037	0x245DC	
+0x4038	0x245D8	
+0x4039	0x29672	
+0x403A	0x246B5	
+0x403B	0x246A8	
+0x403C	0x2468F	
+0x403D	0x2469E	
+0x403E	0x2468E	
+0x403F	0x247DE	
+0x4040	0x247E2	
+0x4041	0x24820	
+0x4042	0x2481D	
+0x4043	0x2481A	
+0x4044	0x24819	
+0x4045	0x2482B	
+0x4046	0x24818	
+0x4047	0x24810	
+0x4048	0x2480E	
+0x4049	0x24824	
+0x404A	0x2481F	
+0x404B	0x24813	
+0x404C	0x24835	
+0x404D	0x24983	
+0x404F	0x249D7	
+0x4050	0x24B02	
+0x4051	0x24B03	
+0x4052	0x24B5C	
+0x4053	0x24B5F	
+0x4054	0x24BC7	
+0x4055	0x24C9A	
+0x4056	0x24C97	
+0x4057	0x24CA3	
+0x4058	0x24DF7	
+0x4059	0x24DC6	
+0x405A	0x24DCC	
+0x405B	0x24DD6	
+0x405C	0x24DCD	
+0x405D	0x24DF9	
+0x405E	0x24DD9	
+0x405F	0x24DD8	
+0x4061	0x24DD1	
+0x4062	0x24DCE	
+0x4063	0x24DD5	
+0x4065	0x24DD4	
+0x4066	0x24DF8	
+0x4067	0x24F7A	
+0x4068	0x24F79	
+0x4069	0x24F7F	
+0x406A	0x24FF3	
+0x406B	0x24FF5	
+0x406C	0x24FF6	
+0x406D	0x24FF4	
+0x406E	0x24FF7	
+0x4070	0x25079	
+0x4071	0x2519C	
+0x4072	0x251DF	
+0x4073	0x251F5	
+0x4074	0x251FF	
+0x4075	0x251D1	
+0x4076	0x251DA	
+0x4077	0x251CF	
+0x4078	0x251CD	
+0x4079	0x251DE	
+0x407A	0x251D8	
+0x407B	0x23AAD	
+0x407C	0x251E0	
+0x407D	0x251FE	
+0x407E	0x2519E	
+0x4121	0x25375	
+0x4122	0x25373	
+0x4123	0x25372	
+0x4124	0x253D8	
+0x4125	0x254D0	
+0x4126	0x254D6	
+0x4127	0x254D7	
+0x4128	0x254CA	
+0x4129	0x254CD	
+0x412A	0x2568A	
+0x412B	0x25689	
+0x412C	0x2568B	
+0x412D	0x257D3	
+0x412E	0x257DA	
+0x412F	0x257CE	
+0x4130	0x257D2	
+0x4132	0x257D4	
+0x4133	0x257D7	
+0x4134	0x257D5	
+0x4135	0x257FB	
+0x4136	0x257CD	
+0x4137	0x257FA	
+0x4138	0x257D6	
+0x413A	0x2599B	
+0x413B	0x2599E	
+0x413C	0x2599D	
+0x413D	0x259A4	
+0x413E	0x2599F	
+0x413F	0x259A5	
+0x4140	0x259A8	
+0x4141	0x25A8F	
+0x4142	0x25A8C	
+0x4143	0x25A95	
+0x4144	0x25B60	
+0x4145	0x25B55	
+0x4146	0x25B5C	
+0x4147	0x25B6F	
+0x4148	0x25B51	
+0x4149	0x25B61	
+0x414A	0x25BA7	
+0x414B	0x25B5E	
+0x414C	0x25B62	
+0x414D	0x25B54	
+0x414E	0x25B6E	
+0x414F	0x25B52	
+0x4150	0x25B58	
+0x4151	0x25B6D	
+0x4152	0x25B5F	
+0x4153	0x25B6C	
+0x4154	0x25B50	
+0x4155	0x25B5D	
+0x4156	0x25B8E	
+0x4157	0x25E72	
+0x4158	0x25E78	
+0x4159	0x25E75	
+0x415A	0x25E76	
+0x415B	0x25E7C	
+0x415C	0x25E7E	
+0x415D	0x25E7D	
+0x415E	0x26015	
+0x415F	0x26014	
+0x4160	0x2601D	
+0x4161	0x2601C	
+0x4162	0x26023	
+0x4163	0x26057	
+0x4164	0x262C8	
+0x4166	0x262C9	
+0x4167	0x262C5	
+0x4168	0x26387	
+0x4169	0x2638A	
+0x416A	0x26394	
+0x416B	0x26439	
+0x416C	0x26440	
+0x416D	0x2643E	
+0x416E	0x26438	
+0x416F	0x264D6	
+0x4171	0x26577	
+0x4172	0x26578	
+0x4173	0x2657D	
+0x4174	0x266DD	
+0x4175	0x2675E	
+0x4176	0x26777	
+0x4177	0x267D4	
+0x4178	0x26766	
+0x4179	0x2675F	
+0x417A	0x26773	
+0x417B	0x26772	
+0x417C	0x26797	
+0x417D	0x2675A	
+0x417E	0x26796	
+0x4221	0x2675D	
+0x4222	0x26765	
+0x4223	0x26770	
+0x4224	0x26775	
+0x4225	0x26774	
+0x4226	0x2675C	
+0x4227	0x26760	
+0x4229	0x2676D	
+0x422A	0x26941	
+0x422B	0x26A3C	
+0x422C	0x26A3E	
+0x422E	0x26A49	
+0x422F	0x26BE4	
+0x4230	0x26D0C	
+0x4231	0x26D15	
+0x4232	0x26D0E	
+0x4233	0x26CD4	
+0x4234	0x26CC7	
+0x4235	0x26D14	
+0x4236	0x26CDB	
+0x4237	0x26D5F	
+0x4238	0x26CED	
+0x4239	0x26D09	
+0x423A	0x26CCF	
+0x423B	0x26CFF	
+0x423C	0x26D1A	
+0x423D	0x26CF5	
+0x423E	0x26CEE	
+0x423F	0x26CE5	
+0x4240	0x26D0D	
+0x4241	0x26CDF	
+0x4242	0x26CEC	
+0x4243	0x26CD7	
+0x4244	0x26D2C	
+0x4245	0x26CCD	
+0x4246	0x26CE3	
+0x4247	0x26D00	
+0x4248	0x26CEB	
+0x4249	0x26CFD	
+0x424A	0x26D0F	
+0x424B	0x26D2D	
+0x424C	0x26D50	
+0x424D	0x26CFE	
+0x424E	0x26CC4	
+0x424F	0x26CE1	
+0x4250	0x26CF9	
+0x4251	0x271BB	
+0x4252	0x271BC	
+0x4255	0x271BA	
+0x4256	0x272D0	
+0x4257	0x272D6	
+0x4258	0x272CE	
+0x4259	0x272E1	
+0x425A	0x272D5	
+0x425B	0x272CF	
+0x425C	0x272D3	
+0x425E	0x272D4	
+0x425F	0x275B5	
+0x4260	0x27690	
+0x4261	0x276A1	
+0x4262	0x27681	
+0x4263	0x27685	
+0x4264	0x2766E	
+0x4265	0x27688	
+0x4266	0x27682	
+0x4267	0x27686	
+0x4268	0x2768F	
+0x4269	0x27689	
+0x426A	0x27680	
+0x426B	0x27684	
+0x426D	0x27829	
+0x426E	0x2782B	
+0x426F	0x2782A	
+0x4270	0x27830	
+0x4271	0x278E2	
+0x4272	0x278E3	
+0x4273	0x278E1	
+0x4274	0x279D5	
+0x4275	0x279C4	
+0x4276	0x279C9	
+0x4277	0x279E0	
+0x4278	0x279DF	
+0x4279	0x279CB	
+0x427A	0x279DD	
+0x427B	0x279E8	
+0x427C	0x279D4	
+0x427D	0x27A1C	
+0x427E	0x27BB5	
+0x4321	0x27BB6	
+0x4322	0x27BE5	
+0x4323	0x27C45	
+0x4324	0x27C49	
+0x4325	0x27C40	
+0x4326	0x27C46	
+0x4327	0x27C44	
+0x4328	0x27C4A	
+0x4329	0x27CC9	
+0x432A	0x27CC4	
+0x432B	0x27CC2	
+0x432C	0x27D68	
+0x432E	0x27D82	
+0x432F	0x27D6B	
+0x4330	0x27D67	
+0x4331	0x27D6C	
+0x4332	0x27D6D	
+0x4333	0x27D71	
+0x4335	0x27ED7	
+0x4336	0x27ED2	
+0x4337	0x27ED9	
+0x4339	0x27EBC	
+0x433A	0x27EDD	
+0x433B	0x27ED6	
+0x433D	0x27ED8	
+0x433E	0x28020	
+0x433F	0x28016	
+0x4340	0x28018	
+0x4341	0x28015	
+0x4342	0x28019	
+0x4343	0x28027	
+0x4344	0x28050	
+0x4345	0x2801D	
+0x4346	0x2802C	
+0x4347	0x2801C	
+0x4348	0x28029	
+0x4349	0x2802B	
+0x434A	0x28024	
+0x434C	0x28028	
+0x434D	0x28239	
+0x434E	0x282F2	
+0x434F	0x282F0	
+0x4351	0x282ED	
+0x4352	0x282EF	
+0x4353	0x282EA	
+0x4354	0x28301	
+0x4355	0x284BC	
+0x4356	0x2855C	
+0x4357	0x2855B	
+0x4358	0x2855A	
+0x4359	0x28526	
+0x435A	0x28743	
+0x435B	0x28733	
+0x435C	0x2873A	
+0x435D	0x28737	
+0x435E	0x28736	
+0x435F	0x2873C	
+0x4360	0x28734	
+0x4361	0x2874A	
+0x4362	0x2873B	
+0x4363	0x28735	
+0x4364	0x2873D	
+0x4365	0x28740	
+0x4366	0x2873E	
+0x4367	0x28717	
+0x4368	0x28826	
+0x4369	0x28824	
+0x436A	0x28810	
+0x436B	0x28836	
+0x436C	0x28825	
+0x436E	0x28966	
+0x436F	0x28C7F	
+0x4370	0x28C7A	
+0x4371	0x28CFB	
+0x4372	0x28CFD	
+0x4373	0x28CFC	
+0x4374	0x28CFA	
+0x4375	0x28ED6	
+0x4376	0x28ED2	
+0x4377	0x28EC8	
+0x4378	0x28EC2	
+0x4379	0x28EC7	
+0x437A	0x28ECD	
+0x437B	0x28EC1	
+0x437C	0x28EC6	
+0x437D	0x28ECC	
+0x437E	0x28FA1	
+0x4421	0x29095	
+0x4422	0x29094	
+0x4423	0x29097	
+0x4424	0x29096	
+0x4425	0x29093	
+0x4426	0x290A1	
+0x4427	0x29209	
+0x4428	0x29208	
+0x4429	0x29267	
+0x442A	0x29265	
+0x442B	0x29262	
+0x442C	0x29261	
+0x442D	0x29397	
+0x442E	0x29401	
+0x442F	0x29419	
+0x4430	0x29418	
+0x4431	0x2945C	
+0x4432	0x29467	
+0x4433	0x2946C	
+0x4435	0x2F9FD	
+0x4436	0x29466	
+0x4437	0x29461	
+0x4438	0x2946E	
+0x4439	0x2945D	
+0x443A	0x2945A	
+0x443B	0x295A2	
+0x443C	0x295A9	
+0x443D	0x295A5	
+0x443E	0x295A6	
+0x443F	0x295B2	
+0x4440	0x295A3	
+0x4441	0x296AC	
+0x4442	0x296AA	
+0x4443	0x296AF	
+0x4444	0x296AB	
+0x4445	0x296B1	
+0x4446	0x296C6	
+0x4447	0x296AD	
+0x4448	0x296B9	
+0x4449	0x29870	
+0x444B	0x29C0C	
+0x444C	0x29C81	
+0x444D	0x29C83	
+0x444E	0x29C7E	
+0x444F	0x29D51	
+0x4450	0x29F99	
+0x4451	0x29F94	
+0x4452	0x29F95	
+0x4453	0x2A2FE	
+0x4454	0x2A418	
+0x4455	0x20105	
+0x4456	0x20372	
+0x4458	0x20399	
+0x4459	0x204AD	
+0x445A	0x20606	
+0x445B	0x207C2	
+0x445C	0x207CB	
+0x445D	0x207D5	
+0x445E	0x207D2	
+0x445F	0x207CC	
+0x4460	0x207D7	
+0x4461	0x207C5	
+0x4462	0x207CA	
+0x4464	0x208A2	
+0x4465	0x208A3	
+0x4466	0x208A1	
+0x4468	0x208A6	
+0x4469	0x208A4	
+0x446A	0x208FF	
+0x446B	0x20900	
+0x446D	0x20A06	
+0x446E	0x20A25	
+0x446F	0x20A9F	
+0x4470	0x20B7F	
+0x4471	0x20EEA	
+0x4472	0x20EEB	
+0x4473	0x20EDE	
+0x4474	0x20F18	
+0x4475	0x20EE0	
+0x4476	0x20EE8	
+0x4477	0x20EDF	
+0x4478	0x20EF1	
+0x4479	0x20EEC	
+0x447A	0x20F1A	
+0x447B	0x20EE6	
+0x447C	0x20EE1	
+0x447D	0x20F5D	
+0x447E	0x20077	
+0x4521	0x20F1E	
+0x4523	0x20F80	
+0x4524	0x21217	
+0x4525	0x2141D	
+0x4526	0x213F7	
+0x4527	0x213EF	
+0x4528	0x213EE	
+0x4529	0x213ED	
+0x452A	0x213F5	
+0x452B	0x2141E	
+0x452C	0x215BD	
+0x452D	0x257FF	
+0x452E	0x215BE	
+0x452F	0x2166D	
+0x4530	0x21676	
+0x4531	0x2184C	
+0x4532	0x21819	
+0x4533	0x21848	
+0x4534	0x2181E	
+0x4535	0x2184A	
+0x4536	0x21849	
+0x4537	0x21826	
+0x4538	0x21995	
+0x4539	0x21A85	
+0x453A	0x21A7E	
+0x453B	0x21A97	
+0x453C	0x21A7D	
+0x453D	0x21B42	
+0x453E	0x21B9E	
+0x453F	0x21C0C	
+0x4540	0x21C0B	
+0x4541	0x21C0E	
+0x4542	0x21CCF	
+0x4543	0x21ED8	
+0x4544	0x21EE0	
+0x4545	0x21EE8	
+0x4546	0x21EE9	
+0x4547	0x21EE2	
+0x4548	0x21EE1	
+0x4549	0x21EDA	
+0x454A	0x21EE3	
+0x454B	0x21ED9	
+0x454C	0x21EF0	
+0x454D	0x21EE7	
+0x454E	0x21EE4	
+0x454F	0x22123	
+0x4550	0x22131	
+0x4551	0x22133	
+0x4552	0x2210C	
+0x4553	0x269E0	
+0x4554	0x22126	
+0x4555	0x22124	
+0x4556	0x22132	
+0x4557	0x22127	
+0x4558	0x22121	
+0x4559	0x22130	
+0x455A	0x221A2	
+0x455B	0x221CC	
+0x455C	0x22296	
+0x455D	0x2F88F	
+0x455E	0x22298	
+0x455F	0x2229C	
+0x4560	0x2229B	
+0x4561	0x2236B	
+0x4562	0x22412	
+0x4563	0x22414	
+0x4564	0x2255A	
+0x4565	0x22554	
+0x4566	0x22551	
+0x4567	0x2255E	
+0x4568	0x22558	
+0x456A	0x22559	
+0x456B	0x2279A	
+0x456C	0x227F2	
+0x456D	0x227AD	
+0x456E	0x22820	
+0x456F	0x227F1	
+0x4570	0x227F0	
+0x4571	0x227F3	
+0x4572	0x227F4	
+0x4573	0x227E9	
+0x4574	0x227FE	
+0x4575	0x2282E	
+0x4576	0x227E8	
+0x4577	0x227E7	
+0x4578	0x227FF	
+0x4579	0x227F5	
+0x457A	0x229E5	
+0x457B	0x229E7	
+0x457C	0x229E6	
+0x457D	0x229E9	
+0x457E	0x22A58	
+0x4621	0x22C6C	
+0x4622	0x22CD9	
+0x4624	0x22CCB	
+0x4626	0x22CBE	
+0x4627	0x22CB5	
+0x4628	0x22CD1	
+0x4629	0x22CC2	
+0x462A	0x22CB6	
+0x462B	0x22CD3	
+0x462C	0x2F8C2	
+0x462D	0x22EDA	
+0x462F	0x22FAE	
+0x4631	0x22FAC	
+0x4632	0x22FA9	
+0x4633	0x22FBA	
+0x4634	0x22FA7	
+0x4635	0x22FB3	
+0x4636	0x22FBD	
+0x4637	0x22FB1	
+0x4638	0x2310E	
+0x4639	0x23111	
+0x463A	0x2310F	
+0x463B	0x23252	
+0x463C	0x2326A	
+0x463D	0x23254	
+0x463E	0x23255	
+0x463F	0x23253	
+0x4640	0x23257	
+0x4641	0x2F8D0	
+0x4642	0x2325B	
+0x4643	0x23258	
+0x4644	0x23259	
+0x4646	0x235B8	
+0x4647	0x235B5	
+0x4648	0x235BF	
+0x4649	0x235C1	
+0x464A	0x235BB	
+0x464C	0x235C3	
+0x464D	0x235AD	
+0x464E	0x235A8	
+0x464F	0x235AE	
+0x4650	0x235AA	
+0x4651	0x235D0	
+0x4652	0x235B1	
+0x4653	0x235BC	
+0x4654	0x235B7	
+0x4655	0x235B0	
+0x4656	0x235FA	
+0x4657	0x235FB	
+0x4658	0x235B9	
+0x4659	0x23907	
+0x465A	0x238FC	
+0x465B	0x238FF	
+0x465C	0x238F2	
+0x465D	0x238F8	
+0x465E	0x238F4	
+0x4661	0x23AAE	
+0x4662	0x23B0F	
+0x4663	0x23B10	
+0x4664	0x29AC1	
+0x4665	0x23BC7	
+0x4666	0x23BC6	
+0x4667	0x23BCE	
+0x4669	0x23BDC	
+0x466A	0x23ED5	
+0x466B	0x23ED3	
+0x466C	0x23F20	
+0x466D	0x23EE2	
+0x466E	0x23EF1	
+0x466F	0x23EDB	
+0x4670	0x23EEA	
+0x4671	0x23EEB	
+0x4672	0x23EE1	
+0x4673	0x23EFF	
+0x4674	0x23ED6	
+0x4675	0x23EE0	
+0x4676	0x23ED7	
+0x4677	0x23EE5	
+0x4679	0x2431B	
+0x467A	0x24310	
+0x467B	0x2430F	
+0x467C	0x2430E	
+0x467D	0x24339	
+0x467E	0x2430A	
+0x4721	0x24314	
+0x4722	0x2430C	
+0x4723	0x24523	
+0x4724	0x2455A	
+0x4725	0x245E2	
+0x4726	0x24693	
+0x4727	0x246B0	
+0x4728	0x246AB	
+0x4729	0x246BD	
+0x472A	0x246B1	
+0x472B	0x2468D	
+0x472C	0x246AD	
+0x472D	0x246AA	
+0x472E	0x246AC	
+0x472F	0x246BC	
+0x4730	0x246C9	
+0x4731	0x24847	
+0x4732	0x24862	
+0x4733	0x24840	
+0x4734	0x24844	
+0x4735	0x2483F	
+0x4736	0x24843	
+0x4737	0x2483D	
+0x4738	0x24860	
+0x4739	0x2485F	
+0x473A	0x2483A	
+0x473B	0x24842	
+0x473C	0x2485E	
+0x473D	0x2485D	
+0x473E	0x249BC	
+0x473F	0x249E0	
+0x4740	0x249EE	
+0x4741	0x249EB	
+0x4742	0x24A0D	
+0x4743	0x24B09	
+0x4744	0x24B0C	
+0x4745	0x24B69	
+0x4746	0x24B74	
+0x4747	0x24B67	
+0x474A	0x24CAD	
+0x474B	0x24DFF	
+0x474C	0x24E16	
+0x474D	0x24E08	
+0x474E	0x24E09	
+0x474F	0x24E00	
+0x4750	0x24DFC	
+0x4751	0x24E13	
+0x4752	0x24E14	
+0x4753	0x24E0A	
+0x4754	0x2983E	
+0x4755	0x24E29	
+0x4756	0x24E17	
+0x4757	0x24E3B	
+0x4758	0x24DFB	
+0x475A	0x24E0E	
+0x475C	0x25008	
+0x475D	0x2521B	
+0x475E	0x2521A	
+0x475F	0x25219	
+0x4760	0x25202	
+0x4762	0x25217	
+0x4763	0x25207	
+0x4764	0x25213	
+0x4765	0x25209	
+0x4766	0x2520A	
+0x4767	0x25212	
+0x4768	0x252AA	
+0x4769	0x25238	
+0x476A	0x2537B	
+0x476B	0x2537C	
+0x476C	0x2537A	
+0x476D	0x253EA	
+0x476E	0x253EB	
+0x476F	0x253EF	
+0x4770	0x253F0	
+0x4771	0x25509	
+0x4772	0x25502	
+0x4773	0x25501	
+0x4774	0x2552B	
+0x4775	0x25507	
+0x4777	0x25528	
+0x4778	0x254FB	
+0x4779	0x2552A	
+0x477A	0x254FE	
+0x477B	0x25504	
+0x477C	0x25529	
+0x477D	0x2550A	
+0x4821	0x256C2	
+0x4823	0x256A6	
+0x4825	0x22FC6	
+0x4826	0x21C07	
+0x4827	0x2580A	
+0x4828	0x257FD	
+0x4829	0x25806	
+0x482A	0x2580D	
+0x482B	0x25809	
+0x482C	0x2580B	
+0x482D	0x25800	
+0x482E	0x25805	
+0x482F	0x2583D	
+0x4830	0x259D5	
+0x4831	0x259BF	
+0x4832	0x259BA	
+0x4833	0x259C7	
+0x4834	0x25A98	
+0x4835	0x25A9A	
+0x4837	0x25BA4	
+0x4838	0x25B9C	
+0x4839	0x25B9D	
+0x483A	0x25BA2	
+0x483B	0x25B96	
+0x483C	0x25B95	
+0x483D	0x25BA5	
+0x483E	0x25BAA	
+0x483F	0x25BAD	
+0x4840	0x25B9A	
+0x4841	0x25BA3	
+0x4842	0x25B97	
+0x4843	0x25B90	
+0x4844	0x25BAF	
+0x4845	0x25B8D	
+0x4847	0x25BA8	
+0x4848	0x25BEE	
+0x4849	0x25EA3	
+0x484A	0x25E99	
+0x484B	0x25EA1	
+0x484C	0x25E9C	
+0x484D	0x25EA4	
+0x484E	0x25ECB	
+0x484F	0x26056	
+0x4850	0x26048	
+0x4851	0x26059	
+0x4852	0x2604A	
+0x4853	0x2605C	
+0x4855	0x2604F	
+0x4856	0x2604D	
+0x4857	0x2605D	
+0x4858	0x2623A	
+0x4859	0x262E3	
+0x485A	0x262E1	
+0x485B	0x262DE	
+0x485C	0x26397	
+0x485D	0x2639A	
+0x485E	0x26448	
+0x485F	0x2644A	
+0x4860	0x2644C	
+0x4861	0x2644E	
+0x4862	0x2644F	
+0x4863	0x2644B	
+0x4864	0x2644D	
+0x4865	0x26447	
+0x4866	0x26451	
+0x4867	0x264DA	
+0x4868	0x264F9	
+0x4869	0x264FC	
+0x486A	0x264FB	
+0x486B	0x264FD	
+0x486C	0x264F8	
+0x486D	0x264FA	
+0x486E	0x2658A	
+0x486F	0x2658E	
+0x4870	0x26588	
+0x4871	0x26589	
+0x4872	0x2658D	
+0x4873	0x26590	
+0x4874	0x2F97E	
+0x4875	0x2671C	
+0x4876	0x267AB	
+0x4877	0x267A4	
+0x4878	0x267A8	
+0x4879	0x267AD	
+0x487A	0x2679F	
+0x487B	0x2679A	
+0x487C	0x267B0	
+0x487D	0x267A5	
+0x487E	0x267D5	
+0x4921	0x267A2	
+0x4922	0x267B2	
+0x4923	0x2679D	
+0x4924	0x267A1	
+0x4925	0x26915	
+0x4926	0x26942	
+0x4927	0x26973	
+0x4928	0x26984	
+0x4929	0x269DD	
+0x492A	0x26A5C	
+0x492B	0x26A4C	
+0x492D	0x26A4B	
+0x492E	0x26C67	
+0x492F	0x26DA8	
+0x4930	0x26D7F	
+0x4931	0x26D8D	
+0x4932	0x26D8B	
+0x4933	0x26DF7	
+0x4934	0x26DA9	
+0x4935	0x26DF4	
+0x4936	0x26D9A	
+0x4937	0x26D8C	
+0x4938	0x26D95	
+0x4939	0x26D7E	
+0x493A	0x26D77	
+0x493D	0x26D71	
+0x493E	0x26DFD	
+0x493F	0x26D88	
+0x4940	0x26D99	
+0x4941	0x26D6D	
+0x4942	0x26DD4	
+0x4943	0x26D91	
+0x4944	0x26D7D	
+0x4945	0x26D63	
+0x4946	0x26D75	
+0x4947	0x26DF9	
+0x4948	0x26D8E	
+0x4949	0x26D74	
+0x494A	0x26DD9	
+0x494B	0x26D66	
+0x494C	0x26DFA	
+0x494D	0x26DF5	
+0x494F	0x271C1	
+0x4950	0x271C9	
+0x4951	0x27303	
+0x4952	0x2732C	
+0x4953	0x27334	
+0x4954	0x27317	
+0x4955	0x27309	
+0x4956	0x27304	
+0x4957	0x27306	
+0x4958	0x2731A	
+0x4959	0x2730E	
+0x495A	0x27327	
+0x495B	0x27305	
+0x495C	0x27307	
+0x495D	0x27319	
+0x495E	0x27314	
+0x495F	0x2730C	
+0x4960	0x2731D	
+0x4961	0x27322	
+0x4962	0x27323	
+0x4963	0x275BB	
+0x4964	0x275BC	
+0x4965	0x275BA	
+0x4966	0x276A9	
+0x4967	0x276B5	
+0x4968	0x276AC	
+0x4969	0x276AA	
+0x496A	0x276AF	
+0x496B	0x276B7	
+0x496E	0x2783D	
+0x496F	0x27845	
+0x4970	0x27848	
+0x4971	0x2783C	
+0x4972	0x2783E	
+0x4973	0x278EC	
+0x4974	0x278ED	
+0x4975	0x278E9	
+0x4976	0x27A0A	
+0x4977	0x27A0B	
+0x4978	0x279F8	
+0x4979	0x27A04	
+0x497A	0x279F6	
+0x497B	0x279F9	
+0x497C	0x27C53	
+0x497D	0x27C52	
+0x497E	0x27C60	
+0x4A21	0x27C63	
+0x4A22	0x27CCE	
+0x4A23	0x27CCD	
+0x4A24	0x27CD0	
+0x4A25	0x27CCC	
+0x4A26	0x27D87	
+0x4A27	0x27D8D	
+0x4A28	0x27D9D	
+0x4A2A	0x27E63	
+0x4A2B	0x27EF4	
+0x4A2C	0x27EF1	
+0x4A2D	0x27EFF	
+0x4A2E	0x27EF5	
+0x4A2F	0x27EFC	
+0x4A30	0x27EF2	
+0x4A31	0x27EF6	
+0x4A33	0x27EFA	
+0x4A35	0x2802E	
+0x4A36	0x28045	
+0x4A37	0x28043	
+0x4A38	0x28051	
+0x4A39	0x2804C	
+0x4A3A	0x28073	
+0x4A3B	0x28047	
+0x4A3C	0x2804B	
+0x4A3D	0x2804F	
+0x4A3F	0x28044	
+0x4A40	0x2804D	
+0x4A41	0x2804E	
+0x4A42	0x2804A	
+0x4A43	0x28041	
+0x4A44	0x28052	
+0x4A45	0x2809F	
+0x4A46	0x28054	
+0x4A47	0x28059	
+0x4A48	0x280A2	
+0x4A49	0x2824B	
+0x4A4A	0x28248	
+0x4A4B	0x2830D	
+0x4A4C	0x2831F	
+0x4A4D	0x28308	
+0x4A4E	0x2830E	
+0x4A4F	0x2831D	
+0x4A50	0x28304	
+0x4A51	0x28418	
+0x4A52	0x2841B	
+0x4A53	0x28566	
+0x4A54	0x28562	
+0x4A55	0x28583	
+0x4A56	0x28567	
+0x4A57	0x28762	
+0x4A58	0x2874F	
+0x4A59	0x2874E	
+0x4A5A	0x28767	
+0x4A5B	0x28753	
+0x4A5C	0x2874D	
+0x4A5D	0x2874C	
+0x4A5E	0x28768	
+0x4A5F	0x28751	
+0x4A61	0x28758	
+0x4A62	0x2875B	
+0x4A63	0x28750	
+0x4A64	0x2876A	
+0x4A65	0x28839	
+0x4A66	0x28838	
+0x4A67	0x28982	
+0x4A68	0x28984	
+0x4A69	0x28986	
+0x4A6A	0x28C80	
+0x4A6B	0x28C86	
+0x4A6C	0x28D25	
+0x4A6D	0x28D11	
+0x4A6F	0x28D0E	
+0x4A70	0x28D15	
+0x4A71	0x28D0F	
+0x4A72	0x28D18	
+0x4A73	0x28D0D	
+0x4A74	0x28D13	
+0x4A75	0x28D16	
+0x4A76	0x28D19	
+0x4A77	0x28F08	
+0x4A78	0x28EF7	
+0x4A79	0x28EFB	
+0x4A7A	0x28EFC	
+0x4A7B	0x28FB4	
+0x4A7C	0x28FBE	
+0x4A7D	0x28FC1	
+0x4A7E	0x290A6	
+0x4B21	0x290A5	
+0x4B22	0x290A2	
+0x4B23	0x290A4	
+0x4B24	0x29212	
+0x4B25	0x2920E	
+0x4B26	0x2927A	
+0x4B27	0x29278	
+0x4B28	0x2927D	
+0x4B29	0x2927E	
+0x4B2A	0x29281	
+0x4B2B	0x29283	
+0x4B2C	0x29280	
+0x4B2D	0x29282	
+0x4B2E	0x2939B	
+0x4B2F	0x29399	
+0x4B30	0x2939C	
+0x4B31	0x2939A	
+0x4B32	0x293A1	
+0x4B33	0x2941A	
+0x4B34	0x2941C	
+0x4B35	0x2948A	
+0x4B36	0x29479	
+0x4B37	0x29473	
+0x4B38	0x29475	
+0x4B39	0x2947C	
+0x4B3A	0x29478	
+0x4B3B	0x29460	
+0x4B3C	0x29483	
+0x4B3D	0x29470	
+0x4B40	0x29487	
+0x4B41	0x29484	
+0x4B42	0x2947B	
+0x4B43	0x2947E	
+0x4B44	0x29474	
+0x4B45	0x295B9	
+0x4B46	0x295B8	
+0x4B47	0x295B7	
+0x4B48	0x295B5	
+0x4B49	0x296CC	
+0x4B4A	0x296CE	
+0x4B4B	0x296D1	
+0x4B4D	0x296CB	
+0x4B4F	0x2987E	
+0x4B50	0x2987A	
+0x4B51	0x29877	
+0x4B52	0x2988C	
+0x4B53	0x298E1	
+0x4B54	0x29A20	
+0x4B55	0x29A1E	
+0x4B56	0x29AC2	
+0x4B57	0x29B0F	
+0x4B58	0x29B00	
+0x4B5A	0x29B10	
+0x4B5B	0x29C0D	
+0x4B5C	0x29C0E	
+0x4B5D	0x29C8E	
+0x4B5E	0x29C8D	
+0x4B5F	0x29C8A	
+0x4B60	0x29C8B	
+0x4B61	0x29C8C	
+0x4B62	0x29C8F	
+0x4B63	0x29D57	
+0x4B65	0x29D55	
+0x4B66	0x29D5B	
+0x4B67	0x29FAC	
+0x4B68	0x29FA7	
+0x4B69	0x29FA0	
+0x4B6A	0x29F9E	
+0x4B6C	0x2A28D	
+0x4B6E	0x2A393	
+0x4B6F	0x2A394	
+0x4B70	0x2A392	
+0x4B71	0x20181	
+0x4B72	0x203D6	
+0x4B73	0x203C3	
+0x4B74	0x203E4	
+0x4B75	0x203E2	
+0x4B76	0x20409	
+0x4B77	0x203BF	
+0x4B78	0x203C8	
+0x4B79	0x203C7	
+0x4B7A	0x204B5	
+0x4B7B	0x204B2	
+0x4B7C	0x2060C	
+0x4B7D	0x2060B	
+0x4B7E	0x2060A	
+0x4C21	0x20605	
+0x4C22	0x207D3	
+0x4C23	0x207E6	
+0x4C24	0x207E9	
+0x4C25	0x207F0	
+0x4C26	0x207EA	
+0x4C27	0x207E7	
+0x4C28	0x208B1	
+0x4C29	0x208B3	
+0x4C2A	0x208B4	
+0x4C2B	0x208B0	
+0x4C2C	0x2095C	
+0x4C2D	0x2095D	
+0x4C2E	0x2095E	
+0x4C2F	0x209C0	
+0x4C30	0x20AAF	
+0x4C32	0x20B86	
+0x4C33	0x20B83	
+0x4C34	0x20B84	
+0x4C35	0x20F5C	
+0x4C36	0x20F70	
+0x4C37	0x20F8C	
+0x4C38	0x20F7B	
+0x4C39	0x20F66	
+0x4C3A	0x20F79	
+0x4C3B	0x20F63	
+0x4C3C	0x20FC5	
+0x4C3D	0x20F6B	
+0x4C3E	0x20F6D	
+0x4C3F	0x20F72	
+0x4C40	0x20F69	
+0x4C41	0x20F75	
+0x4C42	0x20F89	
+0x4C43	0x20FC6	
+0x4C44	0x20FA5	
+0x4C45	0x203E7	
+0x4C46	0x20F6A	
+0x4C47	0x20F97	
+0x4C48	0x2145A	
+0x4C49	0x2145C	
+0x4C4A	0x21459	
+0x4C4B	0x21424	
+0x4C4C	0x21425	
+0x4C4D	0x21430	
+0x4C4E	0x21458	
+0x4C4F	0x21431	
+0x4C50	0x21576	
+0x4C51	0x215C1	
+0x4C52	0x21685	
+0x4C53	0x2167D	
+0x4C54	0x21865	
+0x4C55	0x21887	
+0x4C56	0x21852	
+0x4C57	0x21854	
+0x4C58	0x2188A	
+0x4C59	0x21850	
+0x4C5A	0x21886	
+0x4C5B	0x2184F	
+0x4C5C	0x21868	
+0x4C5D	0x2199D	
+0x4C5E	0x21AA0	
+0x4C5F	0x21ABA	
+0x4C60	0x21ABD	
+0x4C61	0x21AB8	
+0x4C62	0x21BA6	
+0x4C64	0x21CDE	
+0x4C65	0x21CD8	
+0x4C66	0x21CD1	
+0x4C67	0x21F13	
+0x4C69	0x21F0E	
+0x4C6A	0x21F1B	
+0x4C6B	0x21F3A	
+0x4C6D	0x21F1C	
+0x4C6E	0x21F12	
+0x4C6F	0x21F16	
+0x4C70	0x21F1A	
+0x4C71	0x21448	
+0x4C72	0x2214B	
+0x4C73	0x22137	
+0x4C74	0x22136	
+0x4C75	0x22138	
+0x4C76	0x2213A	
+0x4C77	0x22149	
+0x4C78	0x2213C	
+0x4C79	0x2214A	
+0x4C7A	0x222B1	
+0x4C7B	0x222C2	
+0x4C7C	0x222B5	
+0x4C7D	0x222C4	
+0x4C7E	0x222B6	
+0x4D21	0x2241E	
+0x4D22	0x2241F	
+0x4D23	0x224AF	
+0x4D24	0x2256B	
+0x4D25	0x2256F	
+0x4D26	0x22792	
+0x4D27	0x227E4	
+0x4D28	0x2282C	
+0x4D29	0x227EF	
+0x4D2B	0x2284F	
+0x4D2C	0x22852	
+0x4D2D	0x22850	
+0x4D2E	0x2283A	
+0x4D2F	0x22837	
+0x4D30	0x22847	
+0x4D31	0x22864	
+0x4D32	0x22840	
+0x4D33	0x2283C	
+0x4D34	0x22845	
+0x4D35	0x22841	
+0x4D36	0x229F3	
+0x4D38	0x22CC1	
+0x4D39	0x22CB4	
+0x4D3B	0x22D2A	
+0x4D3C	0x22D22	
+0x4D3D	0x22D29	
+0x4D3F	0x22D3E	
+0x4D40	0x22D3C	
+0x4D41	0x22D30	
+0x4D42	0x22FC7	
+0x4D43	0x22FD5	
+0x4D44	0x22FD6	
+0x4D45	0x22FD3	
+0x4D46	0x22FCE	
+0x4D47	0x22FC8	
+0x4D48	0x2305C	
+0x4D49	0x2305F	
+0x4D4A	0x23062	
+0x4D4C	0x230BD	
+0x4D4D	0x230BF	
+0x4D4E	0x2325C	
+0x4D4F	0x232B6	
+0x4D51	0x2329D	
+0x4D52	0x2327F	
+0x4D54	0x23294	
+0x4D55	0x23281	
+0x4D56	0x23347	
+0x4D57	0x23346	
+0x4D59	0x23394	
+0x4D5A	0x23675	
+0x4D5B	0x2361A	
+0x4D5C	0x2362A	
+0x4D5D	0x23632	
+0x4D5E	0x23617	
+0x4D5F	0x23623	
+0x4D60	0x23674	
+0x4D62	0x23676	
+0x4D63	0x2362E	
+0x4D64	0x23625	
+0x4D65	0x23620	
+0x4D66	0x23671	
+0x4D67	0x23616	
+0x4D68	0x23670	
+0x4D69	0x2362C	
+0x4D6A	0x2362F	
+0x4D6B	0x2361F	
+0x4D6C	0x23664	
+0x4D6E	0x23908	
+0x4D6F	0x23914	
+0x4D70	0x2390A	
+0x4D71	0x2390B	
+0x4D72	0x23A4F	
+0x4D73	0x23A59	
+0x4D74	0x23A54	
+0x4D75	0x23A51	
+0x4D76	0x23AB6	
+0x4D77	0x23BEC	
+0x4D78	0x23BED	
+0x4D79	0x23BEA	
+0x4D7A	0x23EEE	
+0x4D7B	0x23F5A	
+0x4D7C	0x23F73	
+0x4D7D	0x23F65	
+0x4D7E	0x23F61	
+0x4E21	0x23F55	
+0x4E22	0x23F6B	
+0x4E23	0x23F64	
+0x4E24	0x23F5B	
+0x4E25	0x23F4C	
+0x4E26	0x23F6F	
+0x4E27	0x23F84	
+0x4E28	0x23F70	
+0x4E29	0x2435D	
+0x4E2A	0x24357	
+0x4E2B	0x24366	
+0x4E2C	0x24353	
+0x4E2D	0x24398	
+0x4E2E	0x24397	
+0x4E2F	0x24528	
+0x4E30	0x245EB	
+0x4E31	0x245EA	
+0x4E32	0x245E8	
+0x4E33	0x245EC	
+0x4E34	0x245EF	
+0x4E35	0x246D1	
+0x4E36	0x246CA	
+0x4E38	0x246CF	
+0x4E39	0x246CD	
+0x4E3A	0x246CE	
+0x4E3B	0x24870	
+0x4E3C	0x24867	
+0x4E3D	0x24873	
+0x4E3E	0x2486D	
+0x4E3F	0x24876	
+0x4E40	0x24879	
+0x4E41	0x2486A	
+0x4E42	0x2488B	
+0x4E43	0x24872	
+0x4E44	0x24871	
+0x4E45	0x2486E	
+0x4E46	0x2487A	
+0x4E47	0x24A16	
+0x4E48	0x24A39	
+0x4E49	0x24A3B	
+0x4E4A	0x24B10	
+0x4E4B	0x24B96	
+0x4E4C	0x24B7B	
+0x4E4D	0x24B7C	
+0x4E4E	0x24B7D	
+0x4E4F	0x24CBE	
+0x4E50	0x24E5C	
+0x4E51	0x24E38	
+0x4E52	0x24E39	
+0x4E53	0x24E2E	
+0x4E54	0x24E34	
+0x4E55	0x24E32	
+0x4E56	0x24E5B	
+0x4E57	0x24E33	
+0x4E58	0x24E3C	
+0x4E5A	0x2500E	
+0x4E5B	0x2500F	
+0x4E5C	0x25010	
+0x4E5D	0x25087	
+0x4E5E	0x2525B	
+0x4E5F	0x25253	
+0x4E61	0x2525C	
+0x4E62	0x2523F	
+0x4E63	0x25259	
+0x4E64	0x2524A	
+0x4E65	0x25244	
+0x4E66	0x2524C	
+0x4E67	0x25240	
+0x4E68	0x2525F	
+0x4E69	0x2525E	
+0x4E6A	0x2524E	
+0x4E6B	0x25254	
+0x4E6C	0x25243	
+0x4E6D	0x25287	
+0x4E6E	0x25382	
+0x4E6F	0x25385	
+0x4E70	0x25531	
+0x4E71	0x25547	
+0x4E72	0x2552E	
+0x4E73	0x2552F	
+0x4E74	0x25548	
+0x4E75	0x25534	
+0x4E77	0x2059F	
+0x4E78	0x25832	
+0x4E79	0x25836	
+0x4E7A	0x25833	
+0x4E7B	0x25831	
+0x4E7C	0x25840	
+0x4E7D	0x25841	
+0x4E7E	0x259DD	
+0x4F21	0x259D2	
+0x4F22	0x259D9	
+0x4F24	0x259DF	
+0x4F25	0x259DB	
+0x4F26	0x259D8	
+0x4F27	0x259D3	
+0x4F28	0x259DE	
+0x4F29	0x259E0	
+0x4F2A	0x259D4	
+0x4F2B	0x259D7	
+0x4F2C	0x259DA	
+0x4F2D	0x25AA7	
+0x4F2E	0x25BFE	
+0x4F2F	0x25BDD	
+0x4F30	0x25C40	
+0x4F31	0x25BE2	
+0x4F33	0x25BD6	
+0x4F34	0x25BDE	
+0x4F35	0x25BEF	
+0x4F37	0x25BEB	
+0x4F38	0x25BEA	
+0x4F39	0x25BE4	
+0x4F3A	0x25BD1	
+0x4F3C	0x25BEC	
+0x4F3D	0x25BFA	
+0x4F3E	0x25BD9	
+0x4F3F	0x25BF3	
+0x4F40	0x25BE1	
+0x4F41	0x25BDC	
+0x4F42	0x25BE5	
+0x4F43	0x25BDF	
+0x4F44	0x25BD4	
+0x4F46	0x25C05	
+0x4F47	0x25ED6	
+0x4F48	0x25ED5	
+0x4F49	0x25ED0	
+0x4F4A	0x25EC8	
+0x4F4B	0x25EC4	
+0x4F4C	0x25EC9	
+0x4F4D	0x25ECD	
+0x4F4E	0x25ED2	
+0x4F4F	0x25ECC	
+0x4F50	0x25ECA	
+0x4F51	0x260A0	
+0x4F52	0x26092	
+0x4F55	0x2608B	
+0x4F56	0x260A1	
+0x4F57	0x26095	
+0x4F58	0x26088	
+0x4F59	0x26086	
+0x4F5A	0x2608D	
+0x4F5B	0x26085	
+0x4F5C	0x26091	
+0x4F5D	0x26089	
+0x4F5E	0x260A2	
+0x4F5F	0x262F0	
+0x4F60	0x262F3	
+0x4F61	0x262F4	
+0x4F62	0x262EF	
+0x4F63	0x26306	
+0x4F64	0x263A2	
+0x4F65	0x2645E	
+0x4F66	0x26463	
+0x4F67	0x26460	
+0x4F68	0x2645B	
+0x4F69	0x2647B	
+0x4F6A	0x26458	
+0x4F6B	0x26459	
+0x4F6C	0x2645D	
+0x4F6D	0x26505	
+0x4F6E	0x26506	
+0x4F6F	0x26502	
+0x4F70	0x26503	
+0x4F71	0x26504	
+0x4F72	0x265A2	
+0x4F73	0x265A7	
+0x4F74	0x265A6	
+0x4F75	0x265A4	
+0x4F76	0x265AC	
+0x4F77	0x265A9	
+0x4F78	0x267E7	
+0x4F79	0x26801	
+0x4F7A	0x267DF	
+0x4F7B	0x267D9	
+0x4F7C	0x267E3	
+0x4F7D	0x2680F	
+0x4F7E	0x2691A	
+0x5021	0x26945	
+0x5022	0x26948	
+0x5023	0x2697B	
+0x5024	0x26985	
+0x5025	0x26986	
+0x5026	0x269FE	
+0x5027	0x269FF	
+0x5028	0x26A64	
+0x5029	0x26A71	
+0x502A	0x26A72	
+0x502B	0x26A61	
+0x502C	0x26A62	
+0x502D	0x26A6C	
+0x502E	0x26A60	
+0x502F	0x26A5D	
+0x5030	0x26A63	
+0x5031	0x26A67	
+0x5032	0x26E01	
+0x5033	0x26E2A	
+0x5034	0x26E30	
+0x5035	0x26E06	
+0x5036	0x26E7D	
+0x5037	0x26E22	
+0x5038	0x26EB9	
+0x5039	0x26E0A	
+0x503A	0x26E10	
+0x503B	0x26D8F	
+0x503C	0x26E80	
+0x503D	0x26E13	
+0x503E	0x26E2E	
+0x503F	0x26E18	
+0x5040	0x26E17	
+0x5041	0x26E1A	
+0x5042	0x26E14	
+0x5043	0x26E47	
+0x5044	0x26E63	
+0x5045	0x26E38	
+0x5047	0x26E7F	
+0x5048	0x26E21	
+0x5049	0x26E37	
+0x504A	0x26E31	
+0x504B	0x26E1B	
+0x504C	0x26EA5	
+0x504D	0x26F6C	
+0x504E	0x271D3	
+0x504F	0x27388	
+0x5050	0x2736E	
+0x5051	0x2735C	
+0x5052	0x27374	
+0x5053	0x27354	
+0x5054	0x27383	
+0x5056	0x27365	
+0x5057	0x27360	
+0x5058	0x27370	
+0x5059	0x2736F	
+0x505A	0x2736D	
+0x505B	0x27372	
+0x505C	0x2736C	
+0x505D	0x27376	
+0x505E	0x27375	
+0x505F	0x27359	
+0x5060	0x273C7	
+0x5061	0x275C1	
+0x5062	0x275F9	
+0x5063	0x276E3	
+0x5064	0x276E7	
+0x5065	0x276D6	
+0x5066	0x276CF	
+0x5067	0x276DA	
+0x5068	0x276E9	
+0x5069	0x276D2	
+0x506A	0x27855	
+0x506B	0x2784F	
+0x506C	0x2784D	
+0x506D	0x27851	
+0x506E	0x27856	
+0x506F	0x278F9	
+0x5070	0x278F8	
+0x5071	0x27906	
+0x5072	0x27903	
+0x5073	0x27909	
+0x5074	0x278F7	
+0x5075	0x278F5	
+0x5076	0x27A47	
+0x5077	0x27A45	
+0x5078	0x27A3E	
+0x5079	0x27A46	
+0x507A	0x27A29	
+0x507B	0x27A34	
+0x507C	0x27A3F	
+0x507D	0x27A44	
+0x507E	0x27A35	
+0x5121	0x27A5A	
+0x5122	0x27A2A	
+0x5123	0x27A33	
+0x5124	0x27A37	
+0x5125	0x27A43	
+0x5126	0x27A39	
+0x5127	0x27A30	
+0x5128	0x27A5D	
+0x5129	0x27A32	
+0x512A	0x27A27	
+0x512B	0x27BBD	
+0x512C	0x27BBA	
+0x512D	0x27BBC	
+0x512E	0x27BF1	
+0x512F	0x27BF0	
+0x5130	0x27C61	
+0x5131	0x27C5C	
+0x5132	0x27C58	
+0x5133	0x27C5D	
+0x5134	0x27CDA	
+0x5135	0x27CD9	
+0x5136	0x27CDD	
+0x5137	0x27CDC	
+0x5138	0x27CDE	
+0x513A	0x27DA0	
+0x513B	0x27DA2	
+0x513C	0x27F0F	
+0x513D	0x27F13	
+0x513E	0x27F12	
+0x513F	0x27F11	
+0x5140	0x27F14	
+0x5141	0x27F19	
+0x5142	0x27F0E	
+0x5143	0x27F17	
+0x5144	0x27F21	
+0x5145	0x27F20	
+0x5146	0x27F16	
+0x5147	0x28078	
+0x5149	0x28087	
+0x514A	0x28079	
+0x514B	0x28080	
+0x514C	0x28077	
+0x514D	0x28081	
+0x514E	0x28046	
+0x514F	0x2807A	
+0x5150	0x2809C	
+0x5151	0x28083	
+0x5152	0x28084	
+0x5153	0x280AD	
+0x5154	0x2809D	
+0x5155	0x2809E	
+0x5156	0x28255	
+0x5157	0x28336	
+0x5158	0x2832B	
+0x5159	0x28327	
+0x515A	0x28346	
+0x515B	0x2832C	
+0x515C	0x28345	
+0x515D	0x28333	
+0x515E	0x2832D	
+0x515F	0x28334	
+0x5160	0x28322	
+0x5162	0x2841F	
+0x5163	0x285B3	
+0x5164	0x2858C	
+0x5165	0x2858F	
+0x5166	0x285AF	
+0x5167	0x285AD	
+0x5168	0x2858E	
+0x5169	0x285AC	
+0x516A	0x285B0	
+0x516B	0x285B1	
+0x516C	0x285AE	
+0x516D	0x28599	
+0x516E	0x286EB	
+0x516F	0x28774	
+0x5170	0x28775	
+0x5171	0x2878E	
+0x5172	0x2876D	
+0x5173	0x28770	
+0x5174	0x2878C	
+0x5175	0x2884F	
+0x5176	0x28851	
+0x5177	0x28858	
+0x5178	0x2884C	
+0x5179	0x2884E	
+0x517A	0x28915	
+0x517B	0x289BE	
+0x517C	0x289DB	
+0x517D	0x289B3	
+0x517E	0x289AE	
+0x5221	0x28C87	
+0x5222	0x28C8A	
+0x5223	0x28C88	
+0x5224	0x28C8B	
+0x5225	0x28C8C	
+0x5226	0x28D44	
+0x5227	0x28D2D	
+0x5228	0x28D2A	
+0x5229	0x28D31	
+0x522A	0x28D2C	
+0x522B	0x28D45	
+0x522C	0x28D30	
+0x522D	0x28D29	
+0x522E	0x28D46	
+0x522F	0x28EF4	
+0x5230	0x28F14	
+0x5231	0x28F10	
+0x5232	0x28F0F	
+0x5233	0x28F12	
+0x5234	0x28F0B	
+0x5235	0x28F0C	
+0x5236	0x28F0A	
+0x5237	0x28F13	
+0x5238	0x28F0E	
+0x5239	0x28FD9	
+0x523A	0x28FD0	
+0x523C	0x290C1	
+0x523D	0x290BF	
+0x523E	0x290BD	
+0x523F	0x290BC	
+0x5240	0x290BA	
+0x5241	0x290BB	
+0x5242	0x290D1	
+0x5243	0x290BE	
+0x5244	0x290D0	
+0x5245	0x290B9	
+0x5246	0x2921A	
+0x5247	0x2921C	
+0x5248	0x2921B	
+0x5249	0x29291	
+0x524A	0x29296	
+0x524B	0x2929F	
+0x524C	0x2929C	
+0x524D	0x2929A	
+0x524E	0x2929D	
+0x524F	0x293AD	
+0x5250	0x293A5	
+0x5251	0x293AE	
+0x5252	0x29403	
+0x5253	0x29426	
+0x5254	0x29420	
+0x5255	0x29423	
+0x5256	0x29424	
+0x5257	0x29421	
+0x5258	0x29428	
+0x5259	0x29425	
+0x525A	0x2941E	
+0x525B	0x29494	
+0x525C	0x29493	
+0x525D	0x2948F	
+0x525E	0x2949A	
+0x525F	0x294AD	
+0x5261	0x295CA	
+0x5262	0x295C5	
+0x5263	0x296BB	
+0x5264	0x296E1	
+0x5265	0x296EA	
+0x5266	0x296E4	
+0x5267	0x296ED	
+0x5268	0x296E6	
+0x5269	0x296E0	
+0x526A	0x296E8	
+0x526B	0x296E5	
+0x526C	0x2981A	
+0x526D	0x29894	
+0x526E	0x29896	
+0x526F	0x2989E	
+0x5270	0x29895	
+0x5271	0x298A1	
+0x5272	0x2988E	
+0x5273	0x2989B	
+0x5274	0x29892	
+0x5275	0x29897	
+0x5276	0x29899	
+0x5277	0x29893	
+0x5278	0x29A32	
+0x5279	0x29A2F	
+0x527A	0x29A2E	
+0x527B	0x29A33	
+0x527C	0x29B1C	
+0x527D	0x29B1E	
+0x527E	0x29B11	
+0x5321	0x29B20	
+0x5322	0x29B1F	
+0x5323	0x29B19	
+0x5324	0x29B16	
+0x5325	0x29CAC	
+0x5326	0x29CB9	
+0x5327	0x29CB3	
+0x5328	0x29CA6	
+0x5329	0x29CA2	
+0x532A	0x29CA9	
+0x532B	0x29CA7	
+0x532C	0x29D6C	
+0x532D	0x29D6D	
+0x532E	0x29D69	
+0x532F	0x29D80	
+0x5330	0x29D66	
+0x5331	0x29D65	
+0x5332	0x29D71	
+0x5333	0x29D6B	
+0x5334	0x29FBD	
+0x5335	0x29FC1	
+0x5336	0x29FD3	
+0x5337	0x29FB6	
+0x5339	0x29FB9	
+0x533A	0x29FD4	
+0x533B	0x29FB7	
+0x533C	0x29FDB	
+0x533D	0x29FB8	
+0x533E	0x29FC0	
+0x533F	0x29FBC	
+0x5340	0x29FD5	
+0x5341	0x29FBF	
+0x5342	0x29FC3	
+0x5343	0x29FC9	
+0x5344	0x2A258	
+0x5345	0x2A290	
+0x5346	0x2A295	
+0x5347	0x2A297	
+0x5348	0x2A309	
+0x5349	0x2A308	
+0x534A	0x2A306	
+0x534B	0x2A305	
+0x534C	0x2A310	
+0x534D	0x2A397	
+0x534E	0x2A395	
+0x534F	0x2A3EE	
+0x5350	0x2A41F	
+0x5351	0x2FA1A	
+0x5352	0x21B4B	
+0x5353	0x2018E	
+0x5354	0x203E8	
+0x5355	0x203F0	
+0x5356	0x203F4	
+0x5357	0x20406	
+0x5358	0x203ED	
+0x535A	0x203E9	
+0x535B	0x20400	
+0x535C	0x204B8	
+0x535D	0x2056D	
+0x535E	0x20804	
+0x535F	0x20801	
+0x5360	0x20803	
+0x5361	0x20802	
+0x5364	0x20962	
+0x5365	0x20ABA	
+0x5366	0x20B13	
+0x5367	0x20FDE	
+0x5368	0x20FD7	
+0x5369	0x20FE4	
+0x536A	0x20FCE	
+0x536B	0x20FE3	
+0x536C	0x20FDD	
+0x536D	0x2103A	
+0x536E	0x20FDB	
+0x536F	0x20FD6	
+0x5370	0x20FE0	
+0x5371	0x20FD4	
+0x5372	0x20FCB	
+0x5373	0x20FE1	
+0x5374	0x20FC9	
+0x5375	0x20FDF	
+0x5376	0x2103C	
+0x5377	0x20FFC	
+0x5378	0x20FCF	
+0x5379	0x21479	
+0x537A	0x21476	
+0x537B	0x21478	
+0x537C	0x21687	
+0x537D	0x2189C	
+0x537E	0x218B1	
+0x5421	0x218C1	
+0x5422	0x2189A	
+0x5423	0x21892	
+0x5425	0x218C2	
+0x5426	0x21896	
+0x5427	0x218C0	
+0x5428	0x21891	
+0x5429	0x21895	
+0x542A	0x219A2	
+0x542B	0x21AC3	
+0x542C	0x21AC0	
+0x542D	0x21AC2	
+0x542E	0x20B8A	
+0x542F	0x21BB0	
+0x5430	0x21C16	
+0x5431	0x21F46	
+0x5432	0x21F4A	
+0x5433	0x21F3E	
+0x5434	0x21F45	
+0x5435	0x21F42	
+0x5437	0x21F5B	
+0x5438	0x21F44	
+0x5439	0x22004	
+0x543A	0x24022	
+0x543B	0x22155	
+0x543C	0x22157	
+0x543D	0x22151	
+0x543E	0x2214E	
+0x543F	0x2215A	
+0x5440	0x222C6	
+0x5441	0x222C3	
+0x5443	0x222C5	
+0x5444	0x222CC	
+0x5445	0x22371	
+0x5446	0x22426	
+0x5447	0x224B2	
+0x5448	0x2257A	
+0x5449	0x22584	
+0x544A	0x2257B	
+0x544B	0x22874	
+0x544C	0x2288C	
+0x544D	0x22851	
+0x544E	0x22848	
+0x544F	0x2288D	
+0x5450	0x22892	
+0x5451	0x22898	
+0x5452	0x22893	
+0x5453	0x228B0	
+0x5454	0x2284E	
+0x5455	0x22896	
+0x5456	0x22897	
+0x5457	0x2289C	
+0x5458	0x228CA	
+0x5459	0x22D33	
+0x545A	0x22D83	
+0x545B	0x22D84	
+0x545C	0x22D9A	
+0x545D	0x22D8C	
+0x545F	0x22D99	
+0x5460	0x22EE0	
+0x5461	0x22FE4	
+0x5462	0x22FF8	
+0x5463	0x22FED	
+0x5464	0x22FF3	
+0x5465	0x22FF4	
+0x5466	0x22FF5	
+0x5467	0x22FFD	
+0x5468	0x23119	
+0x5469	0x2329E	
+0x546A	0x232C4	
+0x546B	0x2329F	
+0x546C	0x2339B	
+0x546D	0x2339F	
+0x546E	0x2339A	
+0x546F	0x236AA	
+0x5470	0x2369D	
+0x5471	0x23692	
+0x5472	0x236A2	
+0x5473	0x236AF	
+0x5474	0x236EB	
+0x5475	0x236A0	
+0x5476	0x236A1	
+0x5477	0x23694	
+0x5478	0x23698	
+0x5479	0x2368F	
+0x547A	0x23687	
+0x547B	0x23684	
+0x547C	0x236A9	
+0x547D	0x2367C	
+0x547E	0x23918	
+0x5521	0x23A5F	
+0x5522	0x23A62	
+0x5523	0x23A61	
+0x5524	0x23AC0	
+0x5525	0x23B15	
+0x5526	0x23BFC	
+0x5527	0x23BF9	
+0x5528	0x23FC8	
+0x5529	0x23FC9	
+0x552A	0x23FDE	
+0x552B	0x23FCA	
+0x552C	0x23FE2	
+0x552F	0x24004	
+0x5530	0x23FCC	
+0x5531	0x23FDD	
+0x5532	0x23FE4	
+0x5533	0x23FD3	
+0x5534	0x23FC7	
+0x5535	0x23FC6	
+0x5537	0x24037	
+0x5538	0x243D8	
+0x5539	0x243EE	
+0x553A	0x243B2	
+0x553B	0x243A3	
+0x553C	0x243B3	
+0x553D	0x243ED	
+0x553E	0x243F8	
+0x553F	0x24531	
+0x5540	0x2455B	
+0x5541	0x24566	
+0x5542	0x24569	
+0x5543	0x24596	
+0x5544	0x2459B	
+0x5545	0x245F7	
+0x5546	0x245F3	
+0x5547	0x245F4	
+0x5548	0x245F5	
+0x5549	0x246E2	
+0x554A	0x246E7	
+0x554B	0x246E5	
+0x554C	0x246E9	
+0x554D	0x246E6	
+0x554E	0x246E3	
+0x554F	0x24874	
+0x5550	0x2487F	
+0x5551	0x2488F	
+0x5552	0x24890	
+0x5553	0x24897	
+0x5554	0x248A3	
+0x5555	0x2488E	
+0x5556	0x24898	
+0x5557	0x2488C	
+0x5558	0x24A42	
+0x5559	0x24A44	
+0x555A	0x24A69	
+0x555B	0x24A43	
+0x555C	0x24A68	
+0x555E	0x24B8D	
+0x555F	0x24B88	
+0x5560	0x24B8B	
+0x5561	0x24B89	
+0x5562	0x24CCC	
+0x5563	0x24D1F	
+0x5564	0x24E80	
+0x5565	0x24E5E	
+0x5566	0x24E67	
+0x5567	0x24E68	
+0x5568	0x24E65	
+0x556A	0x24E74	
+0x556B	0x24E69	
+0x556C	0x24E61	
+0x556D	0x24E62	
+0x556E	0x24E6C	
+0x556F	0x24E93	
+0x5570	0x24E86	
+0x5571	0x24F9D	
+0x5572	0x24F9B	
+0x5573	0x2501B	
+0x5574	0x25016	
+0x5575	0x25019	
+0x5576	0x25014	
+0x5577	0x25018	
+0x5578	0x25015	
+0x5579	0x25099	
+0x557A	0x25098	
+0x557B	0x2525D	
+0x557C	0x25289	
+0x557D	0x2527A	
+0x557E	0x2527D	
+0x5621	0x2524B	
+0x5623	0x25278	
+0x5624	0x2527F	
+0x5625	0x25277	
+0x5626	0x2527E	
+0x5627	0x25279	
+0x5628	0x252AB	
+0x5629	0x2527C	
+0x562A	0x25274	
+0x562B	0x25275	
+0x562C	0x252A7	
+0x562D	0x2538D	
+0x562E	0x2554E	
+0x562F	0x25566	
+0x5630	0x25561	
+0x5631	0x2554D	
+0x5632	0x2554F	
+0x5634	0x25554	
+0x5635	0x2557C	
+0x5636	0x256DA	
+0x5637	0x256DE	
+0x5638	0x256D8	
+0x5639	0x256DD	
+0x563A	0x256DF	
+0x563B	0x25866	
+0x563C	0x25862	
+0x563D	0x2585F	
+0x563E	0x25864	
+0x563F	0x25863	
+0x5640	0x25860	
+0x5641	0x25888	
+0x5642	0x2586A	
+0x5643	0x25867	
+0x5644	0x25887	
+0x5645	0x2583F	
+0x5646	0x2586C	
+0x5647	0x2586E	
+0x5648	0x258AD	
+0x5649	0x259F1	
+0x564A	0x259F4	
+0x564B	0x259F6	
+0x564C	0x259F5	
+0x564D	0x259F8	
+0x564E	0x259FB	
+0x564F	0x259EC	
+0x5650	0x259EF	
+0x5651	0x259ED	
+0x5653	0x259F7	
+0x5654	0x259F9	
+0x5655	0x259FD	
+0x5656	0x25AB1	
+0x5657	0x25C36	
+0x5658	0x25C1B	
+0x5659	0x25C32	
+0x565A	0x25C42	
+0x565B	0x25C4D	
+0x565C	0x25C1F	
+0x565D	0x25C21	
+0x565E	0x25C1C	
+0x565F	0x25C31	
+0x5660	0x25C2E	
+0x5661	0x25C47	
+0x5662	0x25C3B	
+0x5663	0x25C41	
+0x5664	0x25C18	
+0x5665	0x25C39	
+0x5666	0x25C1D	
+0x5667	0x25C27	
+0x5668	0x25C23	
+0x566A	0x25EEE	
+0x566B	0x25EE8	
+0x566C	0x25EE5	
+0x566D	0x25EEF	
+0x566E	0x25EE4	
+0x566F	0x25EEC	
+0x5670	0x25EF0	
+0x5671	0x260D7	
+0x5672	0x260D8	
+0x5673	0x260D4	
+0x5674	0x260CA	
+0x5675	0x260D2	
+0x5676	0x260CB	
+0x5677	0x260D3	
+0x5678	0x260E6	
+0x5679	0x260E2	
+0x567A	0x26249	
+0x567B	0x26248	
+0x567C	0x262FF	
+0x567D	0x26309	
+0x567E	0x263B0	
+0x5721	0x263AF	
+0x5722	0x2647C	
+0x5723	0x26478	
+0x5724	0x2647A	
+0x5725	0x26472	
+0x5726	0x26479	
+0x5727	0x2647E	
+0x5728	0x2650C	
+0x5729	0x2650B	
+0x572A	0x265CD	
+0x572B	0x265BE	
+0x572C	0x265BC	
+0x572D	0x265BF	
+0x572E	0x265C0	
+0x572F	0x265BD	
+0x5730	0x26838	
+0x5731	0x26808	
+0x5732	0x26805	
+0x5733	0x2683B	
+0x5734	0x26810	
+0x5735	0x2680C	
+0x5736	0x2680D	
+0x5737	0x26804	
+0x5738	0x2683A	
+0x5739	0x26813	
+0x573A	0x26837	
+0x573B	0x26839	
+0x573C	0x2691F	
+0x573D	0x2694B	
+0x573E	0x269EE	
+0x573F	0x26A75	
+0x5740	0x26A78	
+0x5741	0x26A7C	
+0x5742	0x26A74	
+0x5743	0x26A76	
+0x5744	0x26AEA	
+0x5745	0x26AEB	
+0x5746	0x26DFB	
+0x5747	0x26E19	
+0x5748	0x26EA7	
+0x5749	0x26E8C	
+0x574A	0x26EDC	
+0x574B	0x26E98	
+0x574C	0x26EBE	
+0x574D	0x26E9E	
+0x574E	0x26F0F	
+0x574F	0x26E9F	
+0x5750	0x26EDD	
+0x5751	0x26E93	
+0x5752	0x26EBB	
+0x5753	0x26EB6	
+0x5754	0x26E90	
+0x5755	0x26EA1	
+0x5756	0x26EBD	
+0x5757	0x26EDE	
+0x5758	0x26E3A	
+0x5759	0x26F22	
+0x575A	0x26E97	
+0x575B	0x26E94	
+0x575C	0x26EC3	
+0x575D	0x26E8E	
+0x575E	0x26EA8	
+0x575F	0x26E99	
+0x5760	0x26EAD	
+0x5761	0x26E9B	
+0x5762	0x26EA2	
+0x5763	0x26F21	
+0x5764	0x26EAC	
+0x5765	0x26F0E	
+0x5766	0x26F31	
+0x5767	0x271E1	
+0x5768	0x271DE	
+0x5769	0x271DF	
+0x576A	0x271DC	
+0x576B	0x271DD	
+0x576C	0x271EC	
+0x576D	0x271E7	
+0x576E	0x27369	
+0x576F	0x273B8	
+0x5770	0x273A1	
+0x5771	0x273A8	
+0x5772	0x273BA	
+0x5773	0x273C2	
+0x5774	0x273A6	
+0x5775	0x273A4	
+0x5776	0x273A3	
+0x5777	0x273AB	
+0x5778	0x273BC	
+0x5779	0x273B7	
+0x577A	0x273BF	
+0x577B	0x273AD	
+0x577C	0x273B1	
+0x577D	0x273CA	
+0x577E	0x273C4	
+0x5821	0x273B9	
+0x5822	0x275C8	
+0x5823	0x275C6	
+0x5824	0x275C7	
+0x5825	0x2770A	
+0x5826	0x2770D	
+0x5827	0x276FB	
+0x5828	0x27703	
+0x5829	0x27702	
+0x582A	0x276FC	
+0x582B	0x276F9	
+0x582C	0x276F8	
+0x582D	0x2786E	
+0x582E	0x27863	
+0x582F	0x27862	
+0x5830	0x27861	
+0x5831	0x2786B	
+0x5833	0x2786F	
+0x5834	0x27866	
+0x5835	0x2786C	
+0x5836	0x2790E	
+0x5837	0x27915	
+0x5838	0x27916	
+0x5839	0x27910	
+0x583A	0x27917	
+0x583B	0x27911	
+0x583C	0x27A6E	
+0x583D	0x27A6C	
+0x583E	0x27A87	
+0x583F	0x27A83	
+0x5840	0x27A63	
+0x5841	0x27ADC	
+0x5842	0x27BC0	
+0x5843	0x27BF7	
+0x5844	0x27BFA	
+0x5845	0x27C70	
+0x5846	0x27C6A	
+0x5847	0x27C68	
+0x5848	0x27C69	
+0x5849	0x27C84	
+0x584A	0x27CEC	
+0x584B	0x27CE7	
+0x584C	0x27CEE	
+0x584D	0x27DBA	
+0x584E	0x27DB2	
+0x584F	0x27DB5	
+0x5850	0x27DCB	
+0x5851	0x2080B	
+0x5852	0x27DD0	
+0x5853	0x27E6D	
+0x5854	0x27E6C	
+0x5856	0x27F45	
+0x5857	0x27F46	
+0x5858	0x27F34	
+0x5859	0x27F2C	
+0x585A	0x27F35	
+0x585B	0x27F44	
+0x585D	0x27F76	
+0x585E	0x280B1	
+0x585F	0x280AA	
+0x5860	0x280A1	
+0x5861	0x280B2	
+0x5863	0x280A6	
+0x5864	0x280B5	
+0x5865	0x280B4	
+0x5866	0x280B8	
+0x5867	0x280AF	
+0x5868	0x280B0	
+0x5869	0x280A3	
+0x586A	0x28262	
+0x586B	0x28264	
+0x586C	0x28356	
+0x586D	0x28351	
+0x586E	0x2834F	
+0x586F	0x28368	
+0x5870	0x2834C	
+0x5871	0x28350	
+0x5873	0x28348	
+0x5874	0x2834A	
+0x5875	0x28421	
+0x5876	0x285E3	
+0x5877	0x285B9	
+0x5878	0x285DE	
+0x5879	0x285B7	
+0x587A	0x285E1	
+0x587B	0x285B6	
+0x587C	0x285B5	
+0x587D	0x285DF	
+0x5921	0x28797	
+0x5922	0x2879A	
+0x5923	0x2879B	
+0x5924	0x28798	
+0x5925	0x28792	
+0x5926	0x28793	
+0x5927	0x287D7	
+0x5928	0x28773	
+0x5929	0x2886B	
+0x592A	0x28874	
+0x592B	0x28878	
+0x592C	0x2886D	
+0x592D	0x28918	
+0x592E	0x289E9	
+0x592F	0x289F5	
+0x5930	0x289EA	
+0x5931	0x28A2E	
+0x5932	0x289E7	
+0x5933	0x289FE	
+0x5934	0x289E5	
+0x5935	0x28A36	
+0x5936	0x289F0	
+0x5937	0x289E6	
+0x5938	0x28A2C	
+0x5939	0x28C89	
+0x593A	0x28C95	
+0x593B	0x28C93	
+0x593C	0x28D4D	
+0x593D	0x28D4A	
+0x593E	0x28D4F	
+0x593F	0x28D50	
+0x5940	0x28D4B	
+0x5941	0x28F2A	
+0x5942	0x28F2B	
+0x5943	0x28F2F	
+0x5944	0x28F2E	
+0x5945	0x28F7C	
+0x5946	0x28FED	
+0x5947	0x28FE2	
+0x5948	0x290E0	
+0x5949	0x290DC	
+0x594A	0x290DA	
+0x594B	0x290D6	
+0x594C	0x290F4	
+0x594D	0x290D9	
+0x594E	0x290D5	
+0x594F	0x29222	
+0x5950	0x29221	
+0x5951	0x29224	
+0x5952	0x29225	
+0x5953	0x29226	
+0x5954	0x29223	
+0x5955	0x292AA	
+0x5956	0x292AF	
+0x5957	0x292B0	
+0x5958	0x292AB	
+0x5959	0x293AF	
+0x595A	0x293B7	
+0x595B	0x293B5	
+0x595C	0x293B2	
+0x595D	0x293B3	
+0x595E	0x2942B	
+0x595F	0x294D8	
+0x5960	0x294C2	
+0x5961	0x294AF	
+0x5962	0x294BC	
+0x5963	0x294B8	
+0x5964	0x294BE	
+0x5965	0x294B7	
+0x5966	0x294B4	
+0x5967	0x294BF	
+0x5968	0x294B3	
+0x5969	0x294B1	
+0x596A	0x294BB	
+0x596B	0x294BD	
+0x596C	0x294D6	
+0x596D	0x294DD	
+0x596E	0x295D8	
+0x596F	0x295D3	
+0x5970	0x295D5	
+0x5971	0x295E3	
+0x5972	0x295E2	
+0x5973	0x295D9	
+0x5974	0x295DE	
+0x5975	0x295DF	
+0x5976	0x295DA	
+0x5977	0x295D4	
+0x5978	0x296F3	
+0x5979	0x296E2	
+0x597A	0x2970D	
+0x597B	0x29701	
+0x597C	0x29705	
+0x597D	0x2971A	
+0x597E	0x29703	
+0x5A21	0x2971F	
+0x5A22	0x29716	
+0x5A23	0x296FA	
+0x5A24	0x296FC	
+0x5A25	0x2970A	
+0x5A27	0x298BC	
+0x5A28	0x298CA	
+0x5A29	0x298B6	
+0x5A2A	0x298C7	
+0x5A2B	0x298BF	
+0x5A2D	0x298B9	
+0x5A2F	0x298B0	
+0x5A30	0x298B8	
+0x5A31	0x298BD	
+0x5A32	0x29891	
+0x5A33	0x298BB	
+0x5A34	0x298BE	
+0x5A35	0x29A3E	
+0x5A36	0x29A3D	
+0x5A37	0x29B38	
+0x5A38	0x29B3D	
+0x5A39	0x29B39	
+0x5A3A	0x29B33	
+0x5A3B	0x29C33	
+0x5A3C	0x29CBB	
+0x5A3D	0x29CC6	
+0x5A3E	0x29CC5	
+0x5A3F	0x29CC7	
+0x5A40	0x29CCB	
+0x5A41	0x29CA8	
+0x5A42	0x29CC8	
+0x5A43	0x29CBE	
+0x5A44	0x29CC1	
+0x5A45	0x29CBD	
+0x5A46	0x29D82	
+0x5A47	0x29D9E	
+0x5A48	0x29D81	
+0x5A49	0x29D84	
+0x5A4B	0x29D96	
+0x5A4C	0x29D8E	
+0x5A4D	0x29D88	
+0x5A4E	0x29D87	
+0x5A4F	0x29FE0	
+0x5A50	0x2A00D	
+0x5A51	0x29FDF	
+0x5A52	0x29FE4	
+0x5A53	0x29FE2	
+0x5A54	0x29FDD	
+0x5A55	0x29FEC	
+0x5A56	0x29FDE	
+0x5A57	0x29FE7	
+0x5A58	0x29FEA	
+0x5A59	0x29FE3	
+0x5A5A	0x2A25C	
+0x5A5C	0x2A25D	
+0x5A5D	0x2A29C	
+0x5A5E	0x2A31D	
+0x5A5F	0x2A39D	
+0x5A60	0x2A39E	
+0x5A61	0x2A39B	
+0x5A62	0x2A3B5	
+0x5A63	0x2A3B9	
+0x5A64	0x2A3B6	
+0x5A65	0x2A3F3	
+0x5A66	0x2A3F2	
+0x5A67	0x2A3F4	
+0x5A68	0x2A426	
+0x5A69	0x2A427	
+0x5A6A	0x2A425	
+0x5A6B	0x2A506	
+0x5A6C	0x2A50B	
+0x5A6D	0x2A53A	
+0x5A6E	0x2A53C	
+0x5A6F	0x2040A	
+0x5A70	0x2040B	
+0x5A71	0x204BF	
+0x5A72	0x204FD	
+0x5A73	0x20618	
+0x5A74	0x291DF	
+0x5A75	0x25390	
+0x5A76	0x2069E	
+0x5A77	0x207FC	
+0x5A78	0x20810	
+0x5A79	0x2080F	
+0x5A7A	0x2080D	
+0x5A7B	0x208B9	
+0x5A7C	0x208B7	
+0x5A7D	0x208BA	
+0x5A7E	0x2090A	
+0x5B21	0x21041	
+0x5B22	0x2108B	
+0x5B23	0x21046	
+0x5B24	0x21053	
+0x5B25	0x210E2	
+0x5B26	0x2103F	
+0x5B27	0x20F7C	
+0x5B28	0x2104B	
+0x5B29	0x2104E	
+0x5B2A	0x2108A	
+0x5B2B	0x21047	
+0x5B2C	0x21493	
+0x5B2D	0x27DCE	
+0x5B2E	0x2148C	
+0x5B2F	0x214AF	
+0x5B30	0x214C9	
+0x5B31	0x215C6	
+0x5B32	0x215C8	
+0x5B33	0x21691	
+0x5B34	0x218CF	
+0x5B35	0x218D4	
+0x5B36	0x218CE	
+0x5B37	0x21ADD	
+0x5B38	0x21AD4	
+0x5B39	0x21F49	
+0x5B3A	0x21F63	
+0x5B3B	0x21F5D	
+0x5B3D	0x21F67	
+0x5B3E	0x21FBB	
+0x5B3F	0x21F60	
+0x5B40	0x21F80	
+0x5B41	0x2215F	
+0x5B42	0x22160	
+0x5B43	0x222DA	
+0x5B44	0x222D2	
+0x5B45	0x222DD	
+0x5B46	0x2258E	
+0x5B47	0x22588	
+0x5B48	0x2256C	
+0x5B49	0x2289E	
+0x5B4A	0x228C9	
+0x5B4B	0x228A4	
+0x5B4D	0x228D9	
+0x5B4E	0x228D2	
+0x5B4F	0x228DA	
+0x5B50	0x228DD	
+0x5B51	0x228CE	
+0x5B52	0x228FC	
+0x5B53	0x22A14	
+0x5B54	0x22A60	
+0x5B55	0x22DD7	
+0x5B56	0x22DCB	
+0x5B57	0x22DCD	
+0x5B58	0x22DD5	
+0x5B59	0x22EE7	
+0x5B5A	0x23000	
+0x5B5B	0x2300A	
+0x5B5C	0x2300F	
+0x5B5D	0x23002	
+0x5B5E	0x23001	
+0x5B5F	0x2311D	
+0x5B60	0x232CA	
+0x5B61	0x232CB	
+0x5B62	0x232CD	
+0x5B63	0x2334F	
+0x5B64	0x2339C	
+0x5B65	0x23680	
+0x5B66	0x2370D	
+0x5B67	0x23702	
+0x5B69	0x23707	
+0x5B6A	0x236F7	
+0x5B6B	0x236F8	
+0x5B6C	0x236FD	
+0x5B6D	0x23724	
+0x5B6E	0x236FB	
+0x5B6F	0x23739	
+0x5B70	0x2373A	
+0x5B71	0x23922	
+0x5B73	0x23A6A	
+0x5B74	0x23A6D	
+0x5B75	0x23A74	
+0x5B76	0x23C0E	
+0x5B77	0x23FDF	
+0x5B78	0x2402B	
+0x5B79	0x23FE3	
+0x5B7A	0x24026	
+0x5B7B	0x2402A	
+0x5B7C	0x24023	
+0x5B7D	0x24035	
+0x5B7E	0x2404A	
+0x5C21	0x243FD	
+0x5C22	0x24400	
+0x5C23	0x2441E	
+0x5C24	0x243FF	
+0x5C25	0x2459E	
+0x5C26	0x245FA	
+0x5C27	0x246F1	
+0x5C28	0x24895	
+0x5C29	0x248A8	
+0x5C2A	0x248A6	
+0x5C2B	0x24A6E	
+0x5C2C	0x24A83	
+0x5C2D	0x24A6D	
+0x5C2E	0x24B8F	
+0x5C30	0x24CDF	
+0x5C31	0x24CD5	
+0x5C32	0x24CE0	
+0x5C33	0x24CD3	
+0x5C34	0x24CD8	
+0x5C35	0x24E8C	
+0x5C37	0x24E94	
+0x5C38	0x24E96	
+0x5C39	0x24E85	
+0x5C3A	0x24E8F	
+0x5C3B	0x24EA9	
+0x5C3C	0x24E8E	
+0x5C3D	0x24E90	
+0x5C3E	0x24EB8	
+0x5C3F	0x24EC3	
+0x5C40	0x24EBB	
+0x5C41	0x24FA5	
+0x5C42	0x24FA2	
+0x5C44	0x24FA3	
+0x5C45	0x250B5	
+0x5C46	0x250AC	
+0x5C47	0x250A8	
+0x5C48	0x252AD	
+0x5C49	0x252B8	
+0x5C4A	0x252B4	
+0x5C4B	0x252AE	
+0x5C4C	0x252B6	
+0x5C4E	0x252C1	
+0x5C4F	0x252BF	
+0x5C50	0x25392	
+0x5C51	0x25400	
+0x5C52	0x25401	
+0x5C53	0x25575	
+0x5C54	0x25572	
+0x5C55	0x25578	
+0x5C56	0x25570	
+0x5C57	0x2557E	
+0x5C58	0x2557D	
+0x5C59	0x2557F	
+0x5C5A	0x256EF	
+0x5C5B	0x2586D	
+0x5C5C	0x2588E	
+0x5C5D	0x2588F	
+0x5C5E	0x2588A	
+0x5C5F	0x2588D	
+0x5C60	0x25895	
+0x5C61	0x2588B	
+0x5C62	0x2588C	
+0x5C63	0x258B0	
+0x5C64	0x25893	
+0x5C65	0x259FC	
+0x5C66	0x25A15	
+0x5C67	0x25A0E	
+0x5C68	0x25A18	
+0x5C69	0x25A11	
+0x5C6A	0x25A0D	
+0x5C6B	0x25ABB	
+0x5C6C	0x25AB3	
+0x5C6E	0x25CA1	
+0x5C6F	0x25C9A	
+0x5C70	0x25C84	
+0x5C71	0x25CA0	
+0x5C72	0x25C86	
+0x5C73	0x25C9D	
+0x5C74	0x25CAA	
+0x5C75	0x25C78	
+0x5C76	0x25C8D	
+0x5C77	0x25C8A	
+0x5C78	0x25CA6	
+0x5C79	0x25C7A	
+0x5C7A	0x25C97	
+0x5C7B	0x25C88	
+0x5C7C	0x25C8E	
+0x5D21	0x25C76	
+0x5D22	0x25C81	
+0x5D23	0x25C85	
+0x5D24	0x25C75	
+0x5D25	0x25CA8	
+0x5D26	0x25C8F	
+0x5D27	0x25C91	
+0x5D28	0x25CA2	
+0x5D29	0x25C9C	
+0x5D2A	0x25C89	
+0x5D2B	0x25C7F	
+0x5D2C	0x25C96	
+0x5D2D	0x25C79	
+0x5D2E	0x25C9F	
+0x5D2F	0x25CA7	
+0x5D31	0x25C87	
+0x5D32	0x25C9B	
+0x5D33	0x25CA5	
+0x5D34	0x25C8B	
+0x5D35	0x25CC9	
+0x5D36	0x25EFF	
+0x5D37	0x25F03	
+0x5D38	0x25F00	
+0x5D39	0x25F02	
+0x5D3A	0x25F04	
+0x5D3B	0x25F05	
+0x5D3C	0x25EE6	
+0x5D3D	0x25F1F	
+0x5D3E	0x26114	
+0x5D40	0x2610C	
+0x5D41	0x2610F	
+0x5D42	0x26119	
+0x5D43	0x2610B	
+0x5D44	0x26113	
+0x5D45	0x260D5	
+0x5D47	0x2611C	
+0x5D48	0x26250	
+0x5D49	0x2624E	
+0x5D4A	0x26312	
+0x5D4B	0x263B9	
+0x5D4C	0x26485	
+0x5D4D	0x26488	
+0x5D4E	0x26490	
+0x5D4F	0x26513	
+0x5D50	0x265D0	
+0x5D51	0x265D1	
+0x5D52	0x265D2	
+0x5D53	0x265D7	
+0x5D54	0x265D6	
+0x5D55	0x265E5	
+0x5D56	0x26846	
+0x5D57	0x2686B	
+0x5D58	0x26845	
+0x5D59	0x2683F	
+0x5D5A	0x2683E	
+0x5D5C	0x2686A	
+0x5D5D	0x26868	
+0x5D5E	0x2684C	
+0x5D5F	0x26923	
+0x5D60	0x26922	
+0x5D61	0x26997	
+0x5D62	0x26991	
+0x5D63	0x25AB5	
+0x5D64	0x26998	
+0x5D65	0x2699C	
+0x5D66	0x26A89	
+0x5D68	0x26A8B	
+0x5D69	0x26A8A	
+0x5D6A	0x26A8D	
+0x5D6B	0x26A8E	
+0x5D6C	0x26A88	
+0x5D6D	0x26F4E	
+0x5D6E	0x26F44	
+0x5D6F	0x26F37	
+0x5D70	0x26F75	
+0x5D71	0x26F54	
+0x5D72	0x26F76	
+0x5D73	0x26F34	
+0x5D74	0x26F6B	
+0x5D75	0x26F32	
+0x5D76	0x26F57	
+0x5D77	0x26F52	
+0x5D78	0x26F45	
+0x5D7A	0x26EB1	
+0x5D7B	0x26F4B	
+0x5D7C	0x26F47	
+0x5D7D	0x26F33	
+0x5D7E	0x26F40	
+0x5E21	0x26F3C	
+0x5E22	0x26F43	
+0x5E23	0x26F4F	
+0x5E24	0x26F55	
+0x5E25	0x26F41	
+0x5E26	0x26FB2	
+0x5E27	0x26FC0	
+0x5E28	0x27434	
+0x5E29	0x273F9	
+0x5E2A	0x27419	
+0x5E2B	0x2740D	
+0x5E2C	0x273FA	
+0x5E2D	0x2741E	
+0x5E2E	0x2741F	
+0x5E2F	0x2740E	
+0x5E30	0x27440	
+0x5E31	0x27408	
+0x5E33	0x27413	
+0x5E34	0x2744C	
+0x5E36	0x275CC	
+0x5E37	0x275CB	
+0x5E38	0x27724	
+0x5E39	0x27725	
+0x5E3A	0x2773D	
+0x5E3B	0x27720	
+0x5E3C	0x27727	
+0x5E3D	0x27726	
+0x5E3E	0x2771D	
+0x5E3F	0x2771E	
+0x5E40	0x27732	
+0x5E41	0x2776C	
+0x5E42	0x27759	
+0x5E44	0x2787A	
+0x5E45	0x27879	
+0x5E46	0x2791B	
+0x5E47	0x2792E	
+0x5E48	0x27923	
+0x5E49	0x27920	
+0x5E4A	0x2791F	
+0x5E4B	0x27AB6	
+0x5E4C	0x27AB9	
+0x5E4D	0x27AA1	
+0x5E4E	0x27AA3	
+0x5E4F	0x27AA8	
+0x5E50	0x27AAF	
+0x5E51	0x27A9A	
+0x5E52	0x27A99	
+0x5E53	0x27AA2	
+0x5E54	0x27A9D	
+0x5E56	0x27AAB	
+0x5E57	0x27BC9	
+0x5E58	0x27BFE	
+0x5E59	0x27C00	
+0x5E5A	0x27BFC	
+0x5E5B	0x27C07	
+0x5E5C	0x27C75	
+0x5E5D	0x27C72	
+0x5E5E	0x27C73	
+0x5E5F	0x27C74	
+0x5E60	0x27CFA	
+0x5E61	0x27CFC	
+0x5E62	0x27CF8	
+0x5E63	0x27CF6	
+0x5E64	0x27CFB	
+0x5E65	0x27DCD	
+0x5E66	0x27DD1	
+0x5E67	0x27DCF	
+0x5E68	0x27E74	
+0x5E69	0x27E72	
+0x5E6A	0x27E73	
+0x5E6B	0x27F54	
+0x5E6C	0x27F51	
+0x5E6E	0x27F53	
+0x5E6F	0x27F49	
+0x5E70	0x27F4C	
+0x5E71	0x27F4A	
+0x5E72	0x27F4F	
+0x5E73	0x27F56	
+0x5E74	0x28100	
+0x5E75	0x280D5	
+0x5E76	0x280D7	
+0x5E77	0x280FF	
+0x5E78	0x280D9	
+0x5E79	0x280E3	
+0x5E7A	0x280D3	
+0x5E7C	0x280D8	
+0x5E7D	0x280D4	
+0x5E7E	0x280DE	
+0x5F21	0x28271	
+0x5F22	0x28374	
+0x5F23	0x28388	
+0x5F24	0x2837F	
+0x5F25	0x2836B	
+0x5F26	0x28387	
+0x5F27	0x28379	
+0x5F28	0x28378	
+0x5F29	0x28389	
+0x5F2A	0x28380	
+0x5F2B	0x28376	
+0x5F2C	0x28429	
+0x5F2D	0x28428	
+0x5F2E	0x2842F	
+0x5F2F	0x285E5	
+0x5F30	0x28604	
+0x5F31	0x28603	
+0x5F32	0x285F0	
+0x5F33	0x285E8	
+0x5F34	0x285EA	
+0x5F35	0x285F1	
+0x5F36	0x28601	
+0x5F37	0x28602	
+0x5F38	0x287A9	
+0x5F39	0x287AB	
+0x5F3A	0x287B7	
+0x5F3B	0x287B6	
+0x5F3D	0x288A0	
+0x5F3E	0x2888E	
+0x5F3F	0x28886	
+0x5F40	0x28887	
+0x5F41	0x28885	
+0x5F42	0x2888B	
+0x5F43	0x28888	
+0x5F44	0x28890	
+0x5F45	0x2891A	
+0x5F46	0x28934	
+0x5F47	0x28A37	
+0x5F48	0x28A2F	
+0x5F49	0x28A30	
+0x5F4A	0x28A39	
+0x5F4B	0x28A34	
+0x5F4C	0x28A33	
+0x5F4D	0x28A85	
+0x5F4E	0x28A84	
+0x5F4F	0x28A3A	
+0x5F50	0x28C9F	
+0x5F51	0x28D69	
+0x5F52	0x28D6C	
+0x5F53	0x28D6A	
+0x5F54	0x28D67	
+0x5F55	0x28D6B	
+0x5F56	0x28F3F	
+0x5F57	0x28F40	
+0x5F58	0x2900B	
+0x5F59	0x290D2	
+0x5F5A	0x290F8	
+0x5F5B	0x29101	
+0x5F5C	0x290FA	
+0x5F5D	0x29116	
+0x5F5E	0x2F9F6	
+0x5F5F	0x2922C	
+0x5F60	0x2922D	
+0x5F61	0x2922F	
+0x5F62	0x2922E	
+0x5F63	0x292C1	
+0x5F64	0x292F5	
+0x5F65	0x292C4	
+0x5F66	0x292DE	
+0x5F67	0x292CC	
+0x5F68	0x292D2	
+0x5F69	0x292C2	
+0x5F6A	0x292CD	
+0x5F6B	0x292CF	
+0x5F6C	0x292DD	
+0x5F6D	0x292C8	
+0x5F6E	0x293BA	
+0x5F6F	0x293BE	
+0x5F70	0x293BF	
+0x5F71	0x2942E	
+0x5F72	0x29430	
+0x5F73	0x294E7	
+0x5F74	0x294EE	
+0x5F75	0x294E8	
+0x5F76	0x294E6	
+0x5F77	0x294E2	
+0x5F78	0x294E4	
+0x5F79	0x294FB	
+0x5F7A	0x294FC	
+0x5F7B	0x294EA	
+0x5F7C	0x295ED	
+0x5F7D	0x295F6	
+0x5F7E	0x295F3	
+0x6021	0x295F4	
+0x6022	0x295F1	
+0x6023	0x295F7	
+0x6024	0x295F5	
+0x6025	0x295EA	
+0x6026	0x295EB	
+0x6027	0x29700	
+0x6028	0x2972C	
+0x6029	0x29712	
+0x602A	0x2973D	
+0x602B	0x29733	
+0x602D	0x29730	
+0x602E	0x29740	
+0x602F	0x29731	
+0x6030	0x29757	
+0x6032	0x29735	
+0x6033	0x29732	
+0x6034	0x2972D	
+0x6035	0x29736	
+0x6036	0x29738	
+0x6037	0x29762	
+0x6038	0x2975F	
+0x6039	0x2978A	
+0x603A	0x298D6	
+0x603B	0x298D8	
+0x603C	0x298DD	
+0x603D	0x298E4	
+0x603E	0x298E3	
+0x603F	0x29A4D	
+0x6040	0x29AD7	
+0x6041	0x29B4A	
+0x6042	0x29B4C	
+0x6043	0x29B50	
+0x6044	0x29B4B	
+0x6045	0x29B4E	
+0x6046	0x29B4F	
+0x6047	0x29C39	
+0x6048	0x29CD2	
+0x6049	0x29CCD	
+0x604A	0x29CD3	
+0x604B	0x29CE1	
+0x604C	0x29CCE	
+0x604D	0x29CD5	
+0x604E	0x29CDD	
+0x604F	0x29CD4	
+0x6050	0x29CCF	
+0x6051	0x29DCB	
+0x6052	0x29DA6	
+0x6053	0x29DC2	
+0x6054	0x29DA5	
+0x6055	0x29DA9	
+0x6056	0x29DA2	
+0x6057	0x29DA4	
+0x6058	0x29DB0	
+0x6059	0x29DCC	
+0x605A	0x29DAF	
+0x605B	0x29DBF	
+0x605C	0x2A024	
+0x605D	0x2A01A	
+0x605E	0x2A014	
+0x605F	0x2A03A	
+0x6060	0x2A020	
+0x6061	0x2A01B	
+0x6062	0x2A021	
+0x6063	0x2A025	
+0x6064	0x2A01E	
+0x6065	0x2A03F	
+0x6066	0x2A040	
+0x6067	0x2A018	
+0x6068	0x2A02C	
+0x6069	0x2A015	
+0x606A	0x2A02D	
+0x606B	0x2A01F	
+0x606C	0x2A029	
+0x606D	0x2A04B	
+0x606E	0x2A2B3	
+0x606F	0x2A2A5	
+0x6070	0x2A2A7	
+0x6071	0x2A2AB	
+0x6072	0x2A2A6	
+0x6073	0x2A2AA	
+0x6074	0x2A322	
+0x6075	0x2A323	
+0x6076	0x2A3A1	
+0x6077	0x2A3A3	
+0x6078	0x2A3A0	
+0x6079	0x2A3BD	
+0x607A	0x2A3BA	
+0x607B	0x2A3FA	
+0x607C	0x2A3F8	
+0x607D	0x2A3FC	
+0x607E	0x2A3F6	
+0x6121	0x2A434	
+0x6122	0x2A443	
+0x6124	0x2A4D4	
+0x6125	0x2A50D	
+0x6126	0x2A543	
+0x6127	0x2A541	
+0x6128	0x2A53D	
+0x6129	0x2A540	
+0x612A	0x2A53E	
+0x612B	0x2A53F	
+0x612C	0x2A546	
+0x612E	0x2A5D4	
+0x612F	0x20435	
+0x6130	0x20436	
+0x6131	0x20432	
+0x6132	0x2043A	
+0x6133	0x204C8	
+0x6134	0x20536	
+0x6135	0x2061E	
+0x6136	0x2061D	
+0x6137	0x2061F	
+0x6138	0x2081C	
+0x6139	0x2081D	
+0x613A	0x20820	
+0x613C	0x208C0	
+0x613D	0x2109A	
+0x613E	0x21093	
+0x613F	0x210DD	
+0x6141	0x210A3	
+0x6142	0x210A9	
+0x6143	0x2109C	
+0x6144	0x2109B	
+0x6146	0x21097	
+0x6147	0x214B1	
+0x6148	0x214CA	
+0x6149	0x214B3	
+0x614A	0x214CD	
+0x614B	0x218EA	
+0x614C	0x218EE	
+0x614D	0x218EF	
+0x614E	0x21ADF	
+0x614F	0x21B50	
+0x6150	0x21BBB	
+0x6151	0x21F88	
+0x6152	0x21F89	
+0x6153	0x21F8C	
+0x6154	0x21F85	
+0x6155	0x21F5E	
+0x6156	0x21F94	
+0x6157	0x21F95	
+0x6158	0x2216B	
+0x6159	0x2216A	
+0x615A	0x22169	
+0x615B	0x222E3	
+0x615C	0x222F1	
+0x615D	0x22437	
+0x615E	0x22433	
+0x615F	0x22591	
+0x6160	0x2258F	
+0x6161	0x22597	
+0x6162	0x228D4	
+0x6163	0x228DE	
+0x6164	0x228D3	
+0x6165	0x228E0	
+0x6166	0x22943	
+0x6167	0x2290B	
+0x6168	0x228FF	
+0x6169	0x22904	
+0x616A	0x22907	
+0x616B	0x22DF9	
+0x616C	0x22DFA	
+0x616D	0x22DFB	
+0x616E	0x22DF8	
+0x616F	0x23012	
+0x6170	0x23010	
+0x6171	0x2311F	
+0x6172	0x232DF	
+0x6173	0x232E3	
+0x6174	0x23352	
+0x6175	0x233A9	
+0x6176	0x23765	
+0x6177	0x23787	
+0x6178	0x23742	
+0x6179	0x23752	
+0x617A	0x2374C	
+0x617B	0x2369F	
+0x617C	0x23701	
+0x617D	0x23748	
+0x617E	0x2374F	
+0x6221	0x2377E	
+0x6222	0x2374D	
+0x6223	0x23758	
+0x6224	0x23747	
+0x6225	0x2375E	
+0x6226	0x23749	
+0x6227	0x2374E	
+0x6228	0x2375D	
+0x6229	0x2375A	
+0x622A	0x23786	
+0x622B	0x23751	
+0x622C	0x23929	
+0x622D	0x239A6	
+0x622E	0x239A7	
+0x622F	0x23A70	
+0x6230	0x23A6F	
+0x6231	0x23AD3	
+0x6232	0x23AD2	
+0x6233	0x23C28	
+0x6234	0x23C1B	
+0x6235	0x23C1A	
+0x6236	0x23C1C	
+0x6237	0x23C21	
+0x6238	0x24032	
+0x6239	0x24066	
+0x623A	0x2407D	
+0x623B	0x24073	
+0x623C	0x2407F	
+0x623D	0x24065	
+0x623E	0x24080	
+0x623F	0x24061	
+0x6240	0x24075	
+0x6241	0x2406E	
+0x6242	0x24067	
+0x6243	0x24071	
+0x6244	0x2406C	
+0x6245	0x24063	
+0x6246	0x24062	
+0x6247	0x24083	
+0x6248	0x240B2	
+0x6249	0x24081	
+0x624A	0x2406F	
+0x624B	0x2406B	
+0x624C	0x24082	
+0x624D	0x2408A	
+0x624E	0x24429	
+0x624F	0x24430	
+0x6250	0x24431	
+0x6251	0x24597	
+0x6252	0x24600	
+0x6253	0x245FF	
+0x6254	0x248B6	
+0x6255	0x248B5	
+0x6256	0x248C3	
+0x6257	0x24A8D	
+0x6258	0x24B18	
+0x6259	0x24B9C	
+0x625A	0x24B9A	
+0x625B	0x24B99	
+0x625C	0x24EB7	
+0x625D	0x24EC4	
+0x625E	0x24EC6	
+0x625F	0x24EC7	
+0x6260	0x24EBC	
+0x6261	0x24EC0	
+0x6262	0x24EC5	
+0x6263	0x24ECD	
+0x6264	0x24EC1	
+0x6265	0x24EBE	
+0x6266	0x24FA7	
+0x6267	0x24FB8	
+0x6268	0x25023	
+0x626A	0x252E8	
+0x626B	0x252DE	
+0x626C	0x252E3	
+0x626D	0x252EF	
+0x626E	0x252DC	
+0x626F	0x252E4	
+0x6270	0x252E1	
+0x6271	0x252E5	
+0x6272	0x25395	
+0x6273	0x25394	
+0x6274	0x25393	
+0x6275	0x2538E	
+0x6276	0x25598	
+0x6277	0x2559C	
+0x6278	0x25599	
+0x6279	0x255A0	
+0x627A	0x2559E	
+0x627B	0x25704	
+0x627C	0x258D3	
+0x627D	0x258B4	
+0x627E	0x258BB	
+0x6321	0x258B7	
+0x6322	0x258B8	
+0x6323	0x258BD	
+0x6324	0x258B6	
+0x6325	0x258B9	
+0x6326	0x258B5	
+0x6327	0x25A22	
+0x6328	0x25A21	
+0x6329	0x25AC3	
+0x632A	0x25ABC	
+0x632B	0x25CFF	
+0x632C	0x25CE5	
+0x632D	0x25CF7	
+0x632E	0x25CD2	
+0x632F	0x25D00	
+0x6330	0x25CDB	
+0x6331	0x25CF0	
+0x6332	0x25CE2	
+0x6333	0x25CCD	
+0x6335	0x25CE1	
+0x6336	0x25CF2	
+0x6337	0x25CDC	
+0x6338	0x25CCC	
+0x6339	0x25CD6	
+0x633A	0x25CF3	
+0x633B	0x25CFA	
+0x633C	0x25CF6	
+0x633D	0x25CEC	
+0x633E	0x25CEA	
+0x633F	0x25CE3	
+0x6340	0x25CD0	
+0x6342	0x25C95	
+0x6343	0x25CD5	
+0x6344	0x25CF4	
+0x6345	0x25CCB	
+0x6346	0x25CDA	
+0x6347	0x25CC8	
+0x6348	0x25CDF	
+0x6349	0x25CF5	
+0x634A	0x25CCF	
+0x634B	0x25CC7	
+0x634C	0x25CD7	
+0x634D	0x25F24	
+0x634F	0x25F1C	
+0x6350	0x25F21	
+0x6351	0x25F1E	
+0x6352	0x25F18	
+0x6353	0x25F1B	
+0x6355	0x26146	
+0x6356	0x2614B	
+0x6357	0x26148	
+0x6358	0x26147	
+0x6359	0x26167	
+0x635A	0x26154	
+0x635B	0x26315	
+0x635C	0x26322	
+0x635D	0x263C5	
+0x635E	0x26329	
+0x635F	0x263C7	
+0x6360	0x2648D	
+0x6361	0x2651B	
+0x6362	0x26520	
+0x6363	0x265E2	
+0x6364	0x265E7	
+0x6365	0x265E8	
+0x6366	0x265E1	
+0x6367	0x26872	
+0x6368	0x2687B	
+0x6369	0x26874	
+0x636A	0x26871	
+0x636B	0x26879	
+0x636C	0x26875	
+0x636D	0x26890	
+0x636E	0x26877	
+0x636F	0x2687D	
+0x6370	0x2694F	
+0x6371	0x26950	
+0x6372	0x269A3	
+0x6373	0x269A2	
+0x6374	0x269F4	
+0x6375	0x26A94	
+0x6376	0x26A9A	
+0x6377	0x26A9B	
+0x6378	0x26AA7	
+0x6379	0x26A97	
+0x637A	0x26A95	
+0x637B	0x26A92	
+0x637C	0x26A9C	
+0x637D	0x26A96	
+0x637E	0x26FB6	
+0x6421	0x26FB8	
+0x6422	0x26FB0	
+0x6423	0x27018	
+0x6424	0x26FC5	
+0x6425	0x26FB5	
+0x6426	0x26FC2	
+0x6427	0x27006	
+0x6428	0x27019	
+0x6429	0x26FB9	
+0x642A	0x27015	
+0x642B	0x26FD6	
+0x642C	0x26FAC	
+0x642E	0x26FC6	
+0x642F	0x26FB3	
+0x6430	0x26FC3	
+0x6431	0x26FCA	
+0x6432	0x26FCF	
+0x6433	0x26FBD	
+0x6434	0x26FCE	
+0x6435	0x27014	
+0x6436	0x26FBA	
+0x6437	0x2701A	
+0x6438	0x26FC1	
+0x6439	0x26FBB	
+0x643C	0x27201	
+0x643D	0x271FC	
+0x643E	0x2745A	
+0x643F	0x27454	
+0x6440	0x27461	
+0x6441	0x2745C	
+0x6442	0x27455	
+0x6443	0x2744A	
+0x6444	0x2744B	
+0x6445	0x27451	
+0x6446	0x27469	
+0x6447	0x2746B	
+0x6449	0x27466	
+0x644A	0x27458	
+0x644B	0x2745D	
+0x644C	0x27467	
+0x644D	0x27456	
+0x644E	0x27488	
+0x644F	0x27464	
+0x6450	0x2744E	
+0x6451	0x27757	
+0x6452	0x2775A	
+0x6453	0x27751	
+0x6454	0x2774A	
+0x6455	0x2774B	
+0x6457	0x27747	
+0x6458	0x2776F	
+0x6459	0x2776A	
+0x645A	0x2776B	
+0x645B	0x27746	
+0x645C	0x2776D	
+0x645D	0x27754	
+0x645E	0x2776E	
+0x645F	0x2774C	
+0x6460	0x27878	
+0x6461	0x27886	
+0x6462	0x27882	
+0x6464	0x27AE1	
+0x6465	0x27AE5	
+0x6466	0x27ADB	
+0x6467	0x27ADE	
+0x6468	0x27AD7	
+0x6469	0x27C03	
+0x646A	0x27C7C	
+0x646B	0x27C7E	
+0x646C	0x27D05	
+0x646D	0x27D07	
+0x646E	0x27DE6	
+0x646F	0x27DE1	
+0x6470	0x27DFB	
+0x6471	0x27DE5	
+0x6472	0x27DE7	
+0x6473	0x27DDF	
+0x6474	0x27DFF	
+0x6475	0x27E76	
+0x6476	0x27F63	
+0x6477	0x27F66	
+0x6478	0x27F65	
+0x6479	0x27F5E	
+0x647A	0x27F64	
+0x647B	0x27F6B	
+0x647C	0x27F5F	
+0x647D	0x27F67	
+0x647E	0x27F68	
+0x6521	0x28108	
+0x6522	0x28109	
+0x6523	0x28117	
+0x6524	0x28115	
+0x6525	0x2811B	
+0x6526	0x2810B	
+0x6527	0x28128	
+0x6528	0x2810E	
+0x6529	0x28118	
+0x652A	0x28153	
+0x652B	0x28145	
+0x652C	0x2810D	
+0x652D	0x2810A	
+0x652E	0x28113	
+0x652F	0x2814A	
+0x6530	0x28279	
+0x6531	0x283A1	
+0x6532	0x2838D	
+0x6533	0x283A2	
+0x6534	0x28390	
+0x6536	0x28431	
+0x6537	0x28430	
+0x6538	0x2861F	
+0x6539	0x28619	
+0x653A	0x2860C	
+0x653B	0x2861E	
+0x653C	0x2861D	
+0x653D	0x28607	
+0x653E	0x28766	
+0x653F	0x287C5	
+0x6540	0x287BA	
+0x6541	0x287BD	
+0x6542	0x287C2	
+0x6543	0x287C3	
+0x6544	0x287BF	
+0x6546	0x288A1	
+0x6547	0x288A2	
+0x6548	0x288A8	
+0x6549	0x288A3	
+0x654A	0x288AA	
+0x654B	0x288AF	
+0x654C	0x288B9	
+0x654D	0x28937	
+0x654E	0x28A8F	
+0x6550	0x28A8E	
+0x6551	0x28A87	
+0x6552	0x28A8A	
+0x6553	0x28A92	
+0x6554	0x28A97	
+0x6555	0x28A9F	
+0x6556	0x28B05	
+0x6557	0x28CA9	
+0x6558	0x28CA7	
+0x6559	0x28D8A	
+0x655A	0x28D82	
+0x655B	0x28D85	
+0x655C	0x28D8B	
+0x655D	0x28D89	
+0x655E	0x28D81	
+0x655F	0x28D80	
+0x6560	0x28D87	
+0x6561	0x28D86	
+0x6562	0x28F4D	
+0x6563	0x2901C	
+0x6564	0x2901F	
+0x6565	0x29121	
+0x6566	0x2911D	
+0x6567	0x29122	
+0x6568	0x290FE	
+0x6569	0x2911B	
+0x656A	0x2913A	
+0x656B	0x29137	
+0x656C	0x29117	
+0x656D	0x29138	
+0x656E	0x29126	
+0x656F	0x29118	
+0x6570	0x29234	
+0x6571	0x29235	
+0x6572	0x29232	
+0x6574	0x292E1	
+0x6575	0x292FD	
+0x6576	0x292E3	
+0x6577	0x292E8	
+0x6578	0x292F9	
+0x6579	0x292FF	
+0x657A	0x292FE	
+0x657C	0x292E0	
+0x657D	0x29300	
+0x6621	0x292EC	
+0x6622	0x292E4	
+0x6623	0x292EF	
+0x6624	0x292FA	
+0x6625	0x293CA	
+0x6626	0x29431	
+0x6627	0x29432	
+0x6628	0x29434	
+0x6629	0x29441	
+0x662A	0x29500	
+0x662B	0x29506	
+0x662C	0x29508	
+0x662D	0x29505	
+0x662E	0x29503	
+0x662F	0x2950B	
+0x6630	0x29502	
+0x6631	0x2950A	
+0x6632	0x295F0	
+0x6633	0x29613	
+0x6634	0x2960A	
+0x6635	0x2960F	
+0x6636	0x29611	
+0x6637	0x29608	
+0x6638	0x2960B	
+0x6639	0x29612	
+0x663A	0x2960D	
+0x663B	0x2975B	
+0x663C	0x29763	
+0x663D	0x29761	
+0x663E	0x29768	
+0x663F	0x2975A	
+0x6640	0x2984E	
+0x6641	0x2984D	
+0x6642	0x29850	
+0x6643	0x298FC	
+0x6644	0x29912	
+0x6645	0x298F5	
+0x6646	0x2991E	
+0x6647	0x298F0	
+0x6648	0x298F3	
+0x6649	0x298F2	
+0x664A	0x29901	
+0x664B	0x298EF	
+0x664C	0x298EE	
+0x664D	0x29916	
+0x664E	0x298F6	
+0x664F	0x298FB	
+0x6650	0x2991C	
+0x6652	0x29A5D	
+0x6653	0x29A60	
+0x6654	0x29A66	
+0x6655	0x29A5F	
+0x6656	0x29A61	
+0x6657	0x29A5B	
+0x6658	0x29A62	
+0x6659	0x29A57	
+0x665A	0x29B69	
+0x665B	0x29B6B	
+0x665C	0x29B61	
+0x665D	0x29B77	
+0x665E	0x29B5F	
+0x665F	0x29B63	
+0x6660	0x29B62	
+0x6661	0x29B65	
+0x6662	0x29CEF	
+0x6663	0x29CE2	
+0x6664	0x29D00	
+0x6665	0x29CE8	
+0x6666	0x29CF2	
+0x6667	0x29CE7	
+0x6669	0x29CE5	
+0x666A	0x29DD5	
+0x666B	0x29DD0	
+0x666C	0x29DDA	
+0x666D	0x29DD3	
+0x666F	0x29DD9	
+0x6670	0x29DCF	
+0x6671	0x29DD6	
+0x6672	0x29DD8	
+0x6673	0x29DF5	
+0x6674	0x29DCE	
+0x6675	0x29DD7	
+0x6676	0x29DF4	
+0x6677	0x29DCD	
+0x6678	0x29E01	
+0x667A	0x2A052	
+0x667B	0x2A055	
+0x667C	0x2A05A	
+0x667D	0x2A04D	
+0x667E	0x2A054	
+0x6721	0x2A053	
+0x6722	0x2A05E	
+0x6723	0x2A067	
+0x6724	0x2A065	
+0x6725	0x2A04E	
+0x6727	0x2A04F	
+0x6728	0x2A061	
+0x6729	0x2A06E	
+0x672A	0x2A051	
+0x672B	0x2A05B	
+0x672C	0x2A263	
+0x672D	0x2A2B7	
+0x672E	0x2A2B6	
+0x672F	0x2A2C3	
+0x6730	0x2A2BB	
+0x6731	0x2A2B5	
+0x6732	0x2A32E	
+0x6733	0x2A330	
+0x6734	0x2A333	
+0x6735	0x2A331	
+0x6736	0x2A3A4	
+0x6737	0x2A3C1	
+0x6738	0x2A3BB	
+0x6739	0x2A3BE	
+0x673A	0x2A400	
+0x673B	0x2A3FF	
+0x673C	0x2A440	
+0x673E	0x2A43F	
+0x673F	0x2A444	
+0x6742	0x2A4DB	
+0x6743	0x2A50F	
+0x6744	0x2A511	
+0x6745	0x2A54E	
+0x6746	0x2A54D	
+0x6747	0x2A54B	
+0x6748	0x2A54C	
+0x6749	0x2A595	
+0x674A	0x2043B	
+0x674B	0x20445	
+0x674C	0x20444	
+0x674D	0x2043E	
+0x674E	0x2043C	
+0x674F	0x2043F	
+0x6750	0x204CC	
+0x6751	0x204CE	
+0x6752	0x20622	
+0x6753	0x20623	
+0x6754	0x2069F	
+0x6755	0x208C5	
+0x6756	0x208C4	
+0x6757	0x210E9	
+0x6758	0x21099	
+0x675A	0x210E6	
+0x675B	0x210E7	
+0x675C	0x210F7	
+0x675D	0x214D2	
+0x675F	0x218FD	
+0x6760	0x2190C	
+0x6761	0x2190B	
+0x6762	0x21CED	
+0x6765	0x21F9B	
+0x6766	0x2200A	
+0x6767	0x2216F	
+0x6768	0x22175	
+0x6769	0x222F2	
+0x676A	0x222F8	
+0x676B	0x2243E	
+0x676C	0x22924	
+0x676D	0x2290E	
+0x676E	0x22916	
+0x676F	0x22918	
+0x6770	0x22910	
+0x6771	0x22931	
+0x6772	0x22944	
+0x6774	0x22929	
+0x6775	0x2292F	
+0x6776	0x2294B	
+0x6777	0x22936	
+0x6779	0x22E34	
+0x677A	0x22E00	
+0x677B	0x22E2B	
+0x677C	0x23020	
+0x677D	0x23021	
+0x677E	0x2301E	
+0x6821	0x2301D	
+0x6822	0x232F5	
+0x6823	0x232F2	
+0x6824	0x232F6	
+0x6825	0x23790	
+0x6826	0x2379D	
+0x6827	0x2379C	
+0x6828	0x23792	
+0x6829	0x23794	
+0x682A	0x237D1	
+0x682B	0x23793	
+0x682C	0x237B7	
+0x682D	0x23797	
+0x682E	0x237B0	
+0x682F	0x2379F	
+0x6830	0x237C9	
+0x6831	0x2392D	
+0x6832	0x2392C	
+0x6833	0x23A77	
+0x6834	0x23C2C	
+0x6835	0x240C0	
+0x6836	0x240B9	
+0x6837	0x24453	
+0x6838	0x24540	
+0x6839	0x24702	
+0x683A	0x246FB	
+0x683C	0x24A8B	
+0x683D	0x24AAE	
+0x683E	0x24AAB	
+0x683F	0x24BA1	
+0x6840	0x2A2CD	
+0x6841	0x24CEA	
+0x6842	0x24EDD	
+0x6843	0x24EDC	
+0x6844	0x24ED9	
+0x6845	0x24FAB	
+0x6846	0x24FAC	
+0x6847	0x24FAD	
+0x6848	0x24FB2	
+0x6849	0x2502C	
+0x684A	0x2502B	
+0x684B	0x250C2	
+0x684C	0x25300	
+0x684D	0x2530D	
+0x684E	0x25306	
+0x684F	0x252FF	
+0x6850	0x25303	
+0x6851	0x25301	
+0x6852	0x25310	
+0x6853	0x2530F	
+0x6854	0x25305	
+0x6855	0x25398	
+0x6856	0x25397	
+0x6857	0x25396	
+0x6858	0x25399	
+0x6859	0x255AC	
+0x685A	0x255AB	
+0x685B	0x25712	
+0x685C	0x258D8	
+0x685D	0x258DF	
+0x685E	0x258D6	
+0x685F	0x25A2D	
+0x6860	0x25A32	
+0x6861	0x25D3F	
+0x6862	0x25D2F	
+0x6863	0x25D26	
+0x6864	0x25D3A	
+0x6865	0x25D39	
+0x6867	0x25D3B	
+0x6868	0x25D35	
+0x6869	0x25D2A	
+0x686A	0x25D21	
+0x686B	0x25D38	
+0x686C	0x25D37	
+0x686D	0x25D34	
+0x686F	0x25D22	
+0x6870	0x25D36	
+0x6871	0x25D44	
+0x6872	0x25F45	
+0x6873	0x25F3B	
+0x6874	0x25F36	
+0x6875	0x25F42	
+0x6876	0x2617A	
+0x6877	0x26186	
+0x6878	0x2618B	
+0x6879	0x2617F	
+0x687A	0x26181	
+0x687B	0x2632A	
+0x687C	0x263D5	
+0x687D	0x2649F	
+0x687E	0x2649D	
+0x6921	0x26526	
+0x6922	0x265F4	
+0x6923	0x265F5	
+0x6924	0x26815	
+0x6925	0x2688E	
+0x6926	0x2688F	
+0x6927	0x26926	
+0x6928	0x269A7	
+0x6929	0x269AF	
+0x692A	0x26AAD	
+0x692B	0x26AAC	
+0x692C	0x26AAB	
+0x692D	0x26AAA	
+0x692E	0x2702F	
+0x692F	0x27021	
+0x6930	0x27023	
+0x6931	0x270A3	
+0x6932	0x27049	
+0x6933	0x2703A	
+0x6934	0x27048	
+0x6935	0x2702D	
+0x6936	0x27025	
+0x6937	0x27029	
+0x6938	0x27032	
+0x6939	0x27034	
+0x693A	0x27024	
+0x693B	0x2702C	
+0x693C	0x2704B	
+0x693D	0x2703B	
+0x693E	0x27020	
+0x693F	0x27028	
+0x6940	0x27498	
+0x6942	0x27497	
+0x6944	0x2749D	
+0x6945	0x274A8	
+0x6946	0x275D5	
+0x6947	0x27777	
+0x6948	0x27778	
+0x6949	0x27772	
+0x694A	0x27773	
+0x694B	0x27802	
+0x694C	0x2793B	
+0x694D	0x27AFE	
+0x694E	0x27B0B	
+0x694F	0x27AFF	
+0x6950	0x27B07	
+0x6953	0x27B30	
+0x6954	0x27BCD	
+0x6955	0x27BCF	
+0x6956	0x27C10	
+0x6957	0x27C0A	
+0x6958	0x27C83	
+0x6959	0x27D15	
+0x695A	0x27D0E	
+0x695B	0x27D0C	
+0x695C	0x27E02	
+0x695D	0x27DFE	
+0x695E	0x27E05	
+0x695F	0x27E15	
+0x6960	0x27E08	
+0x6961	0x27F7F	
+0x6962	0x27F77	
+0x6963	0x27F7C	
+0x6964	0x27F82	
+0x6965	0x27F7E	
+0x6966	0x27F78	
+0x6967	0x27F7D	
+0x6968	0x27F79	
+0x6969	0x27F81	
+0x696A	0x2814B	
+0x696B	0x28163	
+0x696C	0x28164	
+0x696D	0x28156	
+0x696E	0x28154	
+0x696F	0x2814E	
+0x6970	0x28110	
+0x6971	0x2814F	
+0x6972	0x28157	
+0x6973	0x2815E	
+0x6974	0x28151	
+0x6975	0x2816A	
+0x6976	0x28169	
+0x6977	0x283AD	
+0x6978	0x283A4	
+0x6979	0x283AC	
+0x697A	0x283A9	
+0x697B	0x283AE	
+0x697C	0x2044C	
+0x697D	0x28650	
+0x697E	0x28635	
+0x6A21	0x28632	
+0x6A22	0x287D8	
+0x6A23	0x287D1	
+0x6A24	0x287CF	
+0x6A25	0x287BE	
+0x6A26	0x288D5	
+0x6A27	0x288C1	
+0x6A28	0x288C6	
+0x6A29	0x288C3	
+0x6A2A	0x288C2	
+0x6A2B	0x288C0	
+0x6A2C	0x288C5	
+0x6A2D	0x288C7	
+0x6A2E	0x288BF	
+0x6A2F	0x288C4	
+0x6A30	0x288D4	
+0x6A31	0x28A90	
+0x6A32	0x28AD2	
+0x6A34	0x28AD4	
+0x6A35	0x28CAF	
+0x6A36	0x28CAE	
+0x6A37	0x28CB2	
+0x6A38	0x28CAD	
+0x6A39	0x28D9C	
+0x6A3A	0x28DA0	
+0x6A3B	0x28DB6	
+0x6A3C	0x28F3D	
+0x6A3D	0x28F56	
+0x6A3E	0x28F82	
+0x6A3F	0x29028	
+0x6A40	0x2902B	
+0x6A41	0x2913C	
+0x6A42	0x2913E	
+0x6A43	0x2913F	
+0x6A44	0x29142	
+0x6A45	0x2913D	
+0x6A46	0x29141	
+0x6A47	0x2913B	
+0x6A48	0x29149	
+0x6A49	0x29143	
+0x6A4A	0x29239	
+0x6A4B	0x29238	
+0x6A4C	0x29322	
+0x6A4D	0x29308	
+0x6A4E	0x2930C	
+0x6A4F	0x29306	
+0x6A50	0x29313	
+0x6A51	0x29304	
+0x6A52	0x29320	
+0x6A53	0x2931D	
+0x6A54	0x29305	
+0x6A55	0x2930A	
+0x6A56	0x293D6	
+0x6A57	0x293D7	
+0x6A58	0x29436	
+0x6A59	0x29437	
+0x6A5A	0x29523	
+0x6A5B	0x29522	
+0x6A5C	0x29520	
+0x6A5D	0x2951A	
+0x6A5E	0x2951D	
+0x6A5F	0x2961C	
+0x6A60	0x29620	
+0x6A61	0x29677	
+0x6A62	0x2977F	
+0x6A63	0x2978B	
+0x6A64	0x2977D	
+0x6A65	0x29799	
+0x6A66	0x29784	
+0x6A67	0x29789	
+0x6A68	0x29785	
+0x6A69	0x29783	
+0x6A6A	0x29786	
+0x6A6B	0x2979E	
+0x6A6C	0x29853	
+0x6A6D	0x29917	
+0x6A6F	0x29919	
+0x6A70	0x29920	
+0x6A71	0x2991F	
+0x6A72	0x29923	
+0x6A73	0x29918	
+0x6A74	0x29921	
+0x6A75	0x29929	
+0x6A76	0x29924	
+0x6A77	0x29926	
+0x6A78	0x29A5E	
+0x6A79	0x29A6F	
+0x6A7A	0x29A6E	
+0x6A7B	0x29A74	
+0x6A7C	0x29A72	
+0x6A7D	0x29A73	
+0x6A7E	0x29B7D	
+0x6B21	0x29B7E	
+0x6B22	0x29B85	
+0x6B23	0x29B7F	
+0x6B24	0x29B84	
+0x6B25	0x29C44	
+0x6B26	0x29CF5	
+0x6B27	0x29CF8	
+0x6B28	0x29D03	
+0x6B29	0x29CF6	
+0x6B2A	0x29E28	
+0x6B2C	0x29E39	
+0x6B2D	0x29DFB	
+0x6B2E	0x29E0E	
+0x6B2F	0x29DFD	
+0x6B30	0x29E1F	
+0x6B32	0x29E03	
+0x6B34	0x29E10	
+0x6B36	0x29E0D	
+0x6B37	0x29E27	
+0x6B38	0x29E41	
+0x6B39	0x2A072	
+0x6B3A	0x2A078	
+0x6B3B	0x2A080	
+0x6B3D	0x2A085	
+0x6B3E	0x2A07B	
+0x6B40	0x2A07D	
+0x6B41	0x2A091	
+0x6B42	0x2A088	
+0x6B43	0x2A0AA	
+0x6B44	0x2A08D	
+0x6B45	0x2A089	
+0x6B46	0x2A095	
+0x6B47	0x2A09B	
+0x6B48	0x2A08C	
+0x6B49	0x2A09E	
+0x6B4A	0x2A07C	
+0x6B4B	0x2A086	
+0x6B4C	0x2A084	
+0x6B4D	0x2A268	
+0x6B4E	0x2A2C5	
+0x6B4F	0x2A2C4	
+0x6B50	0x2A2C9	
+0x6B51	0x2A2C6	
+0x6B52	0x2A342	
+0x6B53	0x2A345	
+0x6B54	0x2A341	
+0x6B55	0x2A344	
+0x6B56	0x2A3A6	
+0x6B57	0x2A3C2	
+0x6B58	0x2A442	
+0x6B59	0x2A449	
+0x6B5A	0x2A448	
+0x6B5B	0x2A44A	
+0x6B5C	0x2A44C	
+0x6B5D	0x2A44B	
+0x6B5E	0x2A517	
+0x6B5F	0x2A518	
+0x6B60	0x2A515	
+0x6B61	0x2A552	
+0x6B62	0x2A554	
+0x6B63	0x2A553	
+0x6B64	0x2A59A	
+0x6B65	0x2A59B	
+0x6B66	0x2A5DC	
+0x6B67	0x2A5E4	
+0x6B68	0x2A691	
+0x6B6A	0x2A6BA	
+0x6B6B	0x20451	
+0x6B6C	0x2045B	
+0x6B6D	0x204CF	
+0x6B6E	0x23305	
+0x6B6F	0x21113	
+0x6B70	0x21115	
+0x6B71	0x21114	
+0x6B72	0x21123	
+0x6B74	0x21111	
+0x6B75	0x21112	
+0x6B77	0x214F0	
+0x6B78	0x2169B	
+0x6B79	0x21912	
+0x6B7A	0x21916	
+0x6B7B	0x21917	
+0x6B7C	0x219B5	
+0x6B7D	0x21CF4	
+0x6B7E	0x21FB1	
+0x6C21	0x22179	
+0x6C22	0x222FF	
+0x6C23	0x222FC	
+0x6C24	0x222FB	
+0x6C25	0x2243F	
+0x6C26	0x22444	
+0x6C27	0x2259D	
+0x6C28	0x22932	
+0x6C29	0x2294C	
+0x6C2A	0x2292B	
+0x6C2B	0x2295A	
+0x6C2C	0x22A1F	
+0x6C2D	0x22E01	
+0x6C2E	0x22E2D	
+0x6C2F	0x22E27	
+0x6C30	0x22E59	
+0x6C31	0x22E5A	
+0x6C32	0x22E4D	
+0x6C33	0x22E58	
+0x6C34	0x23023	
+0x6C35	0x23025	
+0x6C36	0x2302B	
+0x6C37	0x232FF	
+0x6C38	0x233AE	
+0x6C39	0x237CB	
+0x6C3A	0x237CA	
+0x6C3B	0x237D0	
+0x6C3C	0x237CE	
+0x6C3D	0x237CC	
+0x6C3E	0x237D8	
+0x6C3F	0x237C6	
+0x6C40	0x237D2	
+0x6C41	0x237CF	
+0x6C42	0x237C8	
+0x6C43	0x23B17	
+0x6C45	0x240C4	
+0x6C46	0x29240	
+0x6C47	0x240E9	
+0x6C48	0x240F2	
+0x6C49	0x240FC	
+0x6C4A	0x240EA	
+0x6C4B	0x240EB	
+0x6C4C	0x240FD	
+0x6C4D	0x24478	
+0x6C4E	0x24477	
+0x6C4F	0x24473	
+0x6C50	0x2449E	
+0x6C51	0x24479	
+0x6C52	0x245A2	
+0x6C53	0x24603	
+0x6C54	0x24704	
+0x6C55	0x24705	
+0x6C56	0x248CE	
+0x6C57	0x24ABF	
+0x6C58	0x24EF6	
+0x6C59	0x24EF7	
+0x6C5A	0x25031	
+0x6C5B	0x25030	
+0x6C5C	0x250C9	
+0x6C5D	0x250C7	
+0x6C5E	0x2531C	
+0x6C5F	0x25328	
+0x6C60	0x2531A	
+0x6C61	0x2531E	
+0x6C62	0x2531B	
+0x6C63	0x2531F	
+0x6C64	0x255BF	
+0x6C65	0x255BB	
+0x6C66	0x255BC	
+0x6C67	0x255C0	
+0x6C68	0x2571A	
+0x6C69	0x258EF	
+0x6C6A	0x258EC	
+0x6C6B	0x258E9	
+0x6C6C	0x258F0	
+0x6C6D	0x258FE	
+0x6C6E	0x25A34	
+0x6C6F	0x25D6A	
+0x6C70	0x25D95	
+0x6C71	0x25D6C	
+0x6C72	0x25D72	
+0x6C73	0x25D67	
+0x6C74	0x25D60	
+0x6C75	0x25D6B	
+0x6C76	0x25D5E	
+0x6C77	0x25D6F	
+0x6C78	0x25D66	
+0x6C7A	0x25D62	
+0x6C7B	0x25D5D	
+0x6C7C	0x25D5C	
+0x6C7D	0x2F965	
+0x6C7E	0x25F50	
+0x6D21	0x2619F	
+0x6D23	0x2619E	
+0x6D24	0x261A6	
+0x6D25	0x26335	
+0x6D26	0x26338	
+0x6D27	0x26336	
+0x6D28	0x2633A	
+0x6D29	0x263DC	
+0x6D2A	0x2687C	
+0x6D2B	0x268AB	
+0x6D2D	0x268A8	
+0x6D2E	0x268A7	
+0x6D2F	0x2692B	
+0x6D30	0x2692C	
+0x6D31	0x26928	
+0x6D32	0x2092B	
+0x6D33	0x269A9	
+0x6D34	0x269AA	
+0x6D35	0x269AB	
+0x6D36	0x269F8	
+0x6D37	0x26AB1	
+0x6D38	0x26AF0	
+0x6D39	0x26AEF	
+0x6D3A	0x270A8	
+0x6D3B	0x2708B	
+0x6D3C	0x27094	
+0x6D3D	0x2709E	
+0x6D3E	0x2708F	
+0x6D3F	0x27088	
+0x6D40	0x2707E	
+0x6D41	0x27081	
+0x6D42	0x27030	
+0x6D43	0x2709B	
+0x6D44	0x27082	
+0x6D45	0x27090	
+0x6D46	0x27085	
+0x6D47	0x2707F	
+0x6D48	0x270A9	
+0x6D49	0x270DE	
+0x6D4A	0x2720D	
+0x6D4C	0x274CF	
+0x6D4D	0x274CB	
+0x6D4E	0x274D8	
+0x6D4F	0x274DD	
+0x6D50	0x274D3	
+0x6D51	0x274D0	
+0x6D52	0x274D5	
+0x6D53	0x274D6	
+0x6D54	0x275D6	
+0x6D55	0x27792	
+0x6D56	0x27795	
+0x6D57	0x2A5CB	
+0x6D58	0x2778D	
+0x6D59	0x2779B	
+0x6D5A	0x2779D	
+0x6D5B	0x2778F	
+0x6D5C	0x2779E	
+0x6D5D	0x277A6	
+0x6D5E	0x27896	
+0x6D5F	0x27892	
+0x6D60	0x27B16	
+0x6D61	0x27B2A	
+0x6D62	0x27B29	
+0x6D63	0x27B2C	
+0x6D64	0x27C15	
+0x6D65	0x27C12	
+0x6D66	0x27C11	
+0x6D67	0x27C13	
+0x6D68	0x27C88	
+0x6D69	0x27C8B	
+0x6D6A	0x27C8A	
+0x6D6B	0x27C87	
+0x6D6C	0x27D17	
+0x6D6D	0x27D16	
+0x6D6E	0x27D1A	
+0x6D6F	0x27E19	
+0x6D70	0x27E17	
+0x6D71	0x27F91	
+0x6D72	0x27F94	
+0x6D73	0x2818B	
+0x6D74	0x28190	
+0x6D75	0x2818F	
+0x6D76	0x28186	
+0x6D77	0x28183	
+0x6D78	0x2818E	
+0x6D79	0x28187	
+0x6D7A	0x281A8	
+0x6D7B	0x28185	
+0x6D7C	0x281A6	
+0x6D7D	0x28182	
+0x6D7E	0x281A7	
+0x6E21	0x283B9	
+0x6E22	0x283B7	
+0x6E23	0x283B4	
+0x6E24	0x283B6	
+0x6E25	0x283B3	
+0x6E26	0x283C6	
+0x6E27	0x2863C	
+0x6E28	0x28640	
+0x6E29	0x28638	
+0x6E2A	0x28791	
+0x6E2B	0x287A6	
+0x6E2C	0x287DA	
+0x6E2D	0x288DA	
+0x6E2E	0x288D8	
+0x6E2F	0x288D9	
+0x6E30	0x288DB	
+0x6E31	0x288D7	
+0x6E32	0x28B16	
+0x6E33	0x28B12	
+0x6E34	0x28B1F	
+0x6E36	0x28B14	
+0x6E37	0x28B1A	
+0x6E38	0x28B10	
+0x6E39	0x28CB3	
+0x6E3A	0x28DAE	
+0x6E3B	0x28DC1	
+0x6E3C	0x28DB0	
+0x6E3D	0x28DAF	
+0x6E3E	0x28DB1	
+0x6E3F	0x28DAD	
+0x6E40	0x28DB2	
+0x6E41	0x28DC4	
+0x6E42	0x2903C	
+0x6E43	0x2903F	
+0x6E44	0x29161	
+0x6E45	0x29166	
+0x6E46	0x2923C	
+0x6E47	0x2923B	
+0x6E48	0x2932C	
+0x6E4A	0x2932A	
+0x6E4B	0x2933E	
+0x6E4C	0x2932F	
+0x6E4D	0x29332	
+0x6E4E	0x29327	
+0x6E4F	0x29329	
+0x6E50	0x29340	
+0x6E51	0x293DF	
+0x6E52	0x293DE	
+0x6E53	0x2943C	
+0x6E54	0x2943B	
+0x6E55	0x2943E	
+0x6E56	0x29521	
+0x6E57	0x29546	
+0x6E58	0x2953C	
+0x6E59	0x29536	
+0x6E5A	0x29538	
+0x6E5B	0x29535	
+0x6E5C	0x29631	
+0x6E5D	0x29636	
+0x6E5E	0x2962D	
+0x6E5F	0x29633	
+0x6E60	0x2962F	
+0x6E61	0x2962E	
+0x6E62	0x29635	
+0x6E63	0x297AC	
+0x6E64	0x297A9	
+0x6E65	0x297A6	
+0x6E67	0x2994C	
+0x6E68	0x29943	
+0x6E69	0x29941	
+0x6E6A	0x2994F	
+0x6E6B	0x29942	
+0x6E6C	0x29951	
+0x6E6E	0x29940	
+0x6E6F	0x29950	
+0x6E70	0x29945	
+0x6E71	0x2994A	
+0x6E72	0x2994B	
+0x6E73	0x29A83	
+0x6E74	0x29A82	
+0x6E75	0x29A81	
+0x6E76	0x29AE0	
+0x6E77	0x29B98	
+0x6E78	0x29B9F	
+0x6E79	0x29B9B	
+0x6E7A	0x29B9A	
+0x6E7B	0x29B99	
+0x6E7C	0x29B96	
+0x6E7D	0x29BAE	
+0x6E7E	0x29B9E	
+0x6F21	0x29D09	
+0x6F22	0x29D0D	
+0x6F23	0x29E4E	
+0x6F24	0x29E4A	
+0x6F25	0x29E4D	
+0x6F26	0x29E40	
+0x6F27	0x29E3E	
+0x6F28	0x29E48	
+0x6F29	0x29E42	
+0x6F2A	0x29E62	
+0x6F2B	0x29E45	
+0x6F2C	0x29E51	
+0x6F2D	0x2A0C6	
+0x6F2E	0x2A0D0	
+0x6F2F	0x2A0C0	
+0x6F30	0x2A0B7	
+0x6F31	0x2A0C2	
+0x6F32	0x2A0BC	
+0x6F33	0x2A0C5	
+0x6F34	0x2A0DC	
+0x6F35	0x2A0DB	
+0x6F36	0x2A0D2	
+0x6F37	0x2A0C7	
+0x6F38	0x2A0B6	
+0x6F39	0x2A0C9	
+0x6F3A	0x2A0CC	
+0x6F3B	0x2A0D1	
+0x6F3C	0x2A0CD	
+0x6F3D	0x2A0DA	
+0x6F3E	0x2A0BA	
+0x6F3F	0x2A0D3	
+0x6F40	0x2A0CE	
+0x6F41	0x2A0F6	
+0x6F42	0x2A0BD	
+0x6F43	0x2A0DD	
+0x6F44	0x2A0C8	
+0x6F45	0x2A10D	
+0x6F46	0x2A135	
+0x6F47	0x2A271	
+0x6F48	0x2A26E	
+0x6F49	0x2A26F	
+0x6F4A	0x2A2D6	
+0x6F4B	0x2A34C	
+0x6F4C	0x2A34F	
+0x6F4D	0x2A354	
+0x6F4E	0x2A353	
+0x6F4F	0x2A3C9	
+0x6F50	0x2A3C8	
+0x6F51	0x2A403	
+0x6F53	0x2A404	
+0x6F55	0x2A457	
+0x6F56	0x2A452	
+0x6F57	0x2A453	
+0x6F59	0x2A456	
+0x6F5A	0x2A45C	
+0x6F5B	0x2A455	
+0x6F5C	0x2A564	
+0x6F5D	0x2A55D	
+0x6F5E	0x2A55E	
+0x6F5F	0x2A5A2	
+0x6F60	0x2A5A3	
+0x6F62	0x2A5E7	
+0x6F63	0x2A5E6	
+0x6F64	0x2A698	
+0x6F65	0x2A6AC	
+0x6F66	0x2A6AF	
+0x6F67	0x2A6AE	
+0x6F68	0x20459	
+0x6F69	0x205A9	
+0x6F6A	0x2082A	
+0x6F6B	0x208C7	
+0x6F6C	0x21141	
+0x6F6D	0x21137	
+0x6F6E	0x21135	
+0x6F6F	0x21133	
+0x6F70	0x21139	
+0x6F71	0x21132	
+0x6F72	0x214FF	
+0x6F73	0x21501	
+0x6F74	0x214F8	
+0x6F75	0x2191B	
+0x6F76	0x21919	
+0x6F77	0x21BBF	
+0x6F78	0x21FBC	
+0x6F79	0x21FBE	
+0x6F7A	0x21FBD	
+0x6F7B	0x2217D	
+0x6F7C	0x22446	
+0x6F7D	0x22447	
+0x6F7E	0x225A4	
+0x7021	0x22A21	
+0x7022	0x22A62	
+0x7023	0x22E86	
+0x7025	0x2302F	
+0x7026	0x23031	
+0x7028	0x237F8	
+0x7029	0x237F5	
+0x702A	0x237F9	
+0x702B	0x237F2	
+0x702C	0x237FA	
+0x702D	0x237F3	
+0x702E	0x23814	
+0x702F	0x237FD	
+0x7030	0x2380F	
+0x7031	0x2380E	
+0x7032	0x23801	
+0x7033	0x23937	
+0x7034	0x23935	
+0x7035	0x23934	
+0x7036	0x23931	
+0x7037	0x23A7A	
+0x7038	0x23A7B	
+0x7039	0x23C37	
+0x703A	0x2412B	
+0x703B	0x240FB	
+0x703C	0x24116	
+0x703D	0x24113	
+0x703F	0x24111	
+0x7040	0x2410F	
+0x7041	0x2411B	
+0x7042	0x24138	
+0x7043	0x244A4	
+0x7044	0x24709	
+0x7045	0x24707	
+0x7046	0x2470B	
+0x7047	0x248D3	
+0x7048	0x248D1	
+0x7049	0x248D8	
+0x704A	0x24B1D	
+0x704B	0x24BA9	
+0x704C	0x24BD0	
+0x704D	0x27215	
+0x704E	0x24F02	
+0x704F	0x24F05	
+0x7050	0x24F01	
+0x7051	0x24F00	
+0x7052	0x2532E	
+0x7053	0x25330	
+0x7054	0x2532F	
+0x7055	0x25331	
+0x7056	0x255D2	
+0x7057	0x255D3	
+0x7058	0x25902	
+0x7059	0x25A40	
+0x705A	0x25A42	
+0x705B	0x25A3B	
+0x705C	0x25ACE	
+0x705D	0x25D98	
+0x705E	0x25D8F	
+0x705F	0x25D94	
+0x7060	0x25D91	
+0x7062	0x25DBA	
+0x7063	0x25D90	
+0x7064	0x25D86	
+0x7065	0x25D9A	
+0x7066	0x25D8C	
+0x7067	0x25D93	
+0x7068	0x25D87	
+0x7069	0x25D88	
+0x706A	0x25D97	
+0x706B	0x25D8D	
+0x706C	0x25D9C	
+0x706D	0x25DBD	
+0x706E	0x25F3C	
+0x706F	0x25F59	
+0x7071	0x261D1	
+0x7072	0x261BB	
+0x7073	0x261BE	
+0x7074	0x2625D	
+0x7075	0x263E2	
+0x7076	0x26605	
+0x7077	0x268BA	
+0x7079	0x268F4	
+0x707A	0x269B2	
+0x707B	0x269F9	
+0x707C	0x26AB7	
+0x707D	0x26AB6	
+0x707E	0x27089	
+0x7121	0x270F9	
+0x7122	0x270D9	
+0x7123	0x270E8	
+0x7124	0x270D4	
+0x7125	0x270DB	
+0x7126	0x270E2	
+0x7127	0x270DF	
+0x7128	0x270D1	
+0x7129	0x270E9	
+0x712A	0x270EA	
+0x712B	0x27213	
+0x712C	0x27211	
+0x712D	0x274FA	
+0x712E	0x274F8	
+0x712F	0x274F4	
+0x7130	0x274FB	
+0x7131	0x2750E	
+0x7132	0x27502	
+0x7133	0x2750F	
+0x7134	0x27790	
+0x7135	0x277AD	
+0x7136	0x277A9	
+0x7137	0x27948	
+0x7138	0x27B5A	
+0x7139	0x27B4F	
+0x713A	0x27B4E	
+0x713B	0x27B55	
+0x713C	0x27B54	
+0x713D	0x27B4A	
+0x713E	0x27BD5	
+0x713F	0x27C18	
+0x7140	0x27C8D	
+0x7141	0x27D1D	
+0x7142	0x27D19	
+0x7143	0x27E26	
+0x7144	0x27E28	
+0x7145	0x27E2B	
+0x7146	0x27E7D	
+0x7147	0x27FA0	
+0x7148	0x27F9A	
+0x7149	0x27F9B	
+0x714A	0x281B5	
+0x714B	0x281AD	
+0x714C	0x281B2	
+0x714D	0x28294	
+0x714E	0x283C9	
+0x714F	0x2864E	
+0x7150	0x2864F	
+0x7151	0x28644	
+0x7152	0x28652	
+0x7153	0x288E9	
+0x7154	0x28939	
+0x7157	0x28DC7	
+0x7158	0x28DD3	
+0x7159	0x28DC6	
+0x715A	0x28DC3	
+0x715C	0x28DD2	
+0x715D	0x28F66	
+0x715E	0x2917F	
+0x715F	0x29180	
+0x7160	0x29184	
+0x7161	0x29185	
+0x7162	0x291E3	
+0x7164	0x29241	
+0x7165	0x29244	
+0x7166	0x29243	
+0x7167	0x2934E	
+0x7168	0x2934F	
+0x716A	0x29349	
+0x716B	0x2934A	
+0x716C	0x2934B	
+0x716D	0x29343	
+0x716E	0x293E0	
+0x716F	0x293E5	
+0x7170	0x293E1	
+0x7171	0x293E6	
+0x7172	0x293E2	
+0x7173	0x2940C	
+0x7174	0x29440	
+0x7175	0x29549	
+0x7176	0x2954A	
+0x7177	0x29554	
+0x7178	0x2954C	
+0x7179	0x29555	
+0x717A	0x29556	
+0x717B	0x2963B	
+0x717C	0x2963D	
+0x717D	0x297A4	
+0x717E	0x297A8	
+0x7221	0x297C3	
+0x7222	0x297BF	
+0x7223	0x297C8	
+0x7224	0x297C2	
+0x7225	0x297CA	
+0x7226	0x297CC	
+0x7227	0x297C9	
+0x7228	0x297BE	
+0x7229	0x297CD	
+0x722A	0x297C7	
+0x722B	0x297C5	
+0x722C	0x2985D	
+0x722E	0x2996C	
+0x722F	0x2996B	
+0x7230	0x29970	
+0x7231	0x2996D	
+0x7232	0x2996F	
+0x7233	0x29989	
+0x7234	0x29984	
+0x7235	0x29A8D	
+0x7236	0x29A8A	
+0x7237	0x29A8E	
+0x7238	0x29A91	
+0x7239	0x29BB5	
+0x723A	0x29BB1	
+0x723B	0x29BAF	
+0x723C	0x29BB9	
+0x723D	0x29BB7	
+0x723E	0x29BB0	
+0x7240	0x29C17	
+0x7242	0x29C4F	
+0x7243	0x29D19	
+0x7244	0x29D10	
+0x7245	0x29D18	
+0x7246	0x29D11	
+0x7247	0x29D1C	
+0x7248	0x29D12	
+0x7249	0x29E76	
+0x724A	0x29E71	
+0x724C	0x29E7A	
+0x724D	0x29E7F	
+0x724F	0x29E73	
+0x7250	0x29EAB	
+0x7252	0x29E77	
+0x7253	0x29E74	
+0x7254	0x29E7E	
+0x7255	0x29E9B	
+0x7256	0x29E84	
+0x7257	0x29E7C	
+0x7258	0x2A129	
+0x7259	0x2A12B	
+0x725A	0x2A10E	
+0x725B	0x2A100	
+0x725C	0x2A10B	
+0x725D	0x2A0FE	
+0x725E	0x2A0FA	
+0x725F	0x2A117	
+0x7260	0x2A0FF	
+0x7261	0x2A10C	
+0x7262	0x2A10F	
+0x7264	0x2A102	
+0x7265	0x2A101	
+0x7266	0x2A0FC	
+0x7267	0x2A149	
+0x7268	0x2A106	
+0x7269	0x2A112	
+0x726A	0x2A113	
+0x726B	0x2A278	
+0x726C	0x2A35B	
+0x726D	0x2A362	
+0x726E	0x2A35F	
+0x726F	0x2A35D	
+0x7270	0x2A3AB	
+0x7271	0x2A3D5	
+0x7272	0x2A3D4	
+0x7273	0x2A3D3	
+0x7274	0x2A407	
+0x7275	0x2A46C	
+0x7276	0x2A470	
+0x7277	0x2A46E	
+0x7278	0x2A468	
+0x7279	0x2A46D	
+0x727A	0x2A477	
+0x727B	0x2A46A	
+0x727C	0x2A4CE	
+0x727D	0x2A4EC	
+0x727E	0x2A569	
+0x7321	0x2A568	
+0x7322	0x2A5A6	
+0x7323	0x2A5A9	
+0x7324	0x2A5AA	
+0x7325	0x2A600	
+0x7326	0x2A60D	
+0x7327	0x2A5F8	
+0x7328	0x2A5FC	
+0x7329	0x2A60A	
+0x732A	0x2A5F7	
+0x732B	0x2A601	
+0x732C	0x2A6B6	
+0x732D	0x2A6BB	
+0x732E	0x2A6B7	
+0x732F	0x2A6B9	
+0x7330	0x2A6CA	
+0x7331	0x20469	
+0x7332	0x20625	
+0x7333	0x21159	
+0x7334	0x21507	
+0x7335	0x21509	
+0x7336	0x21922	
+0x7337	0x21B07	
+0x7338	0x21B04	
+0x7339	0x2330F	
+0x733A	0x21CF8	
+0x733B	0x21FC7	
+0x733C	0x21FD1	
+0x733D	0x2217E	
+0x733E	0x22308	
+0x733F	0x2244A	
+0x7340	0x2F898	
+0x7341	0x224B9	
+0x7342	0x22E88	
+0x7343	0x22E91	
+0x7344	0x22E84	
+0x7345	0x22E73	
+0x7346	0x22E89	
+0x7347	0x22E85	
+0x7348	0x23033	
+0x7349	0x23313	
+0x734A	0x2381D	
+0x734B	0x2381F	
+0x734C	0x2381C	
+0x734D	0x23820	
+0x734E	0x2381A	
+0x734F	0x2381B	
+0x7350	0x23939	
+0x7351	0x239AF	
+0x7352	0x23AE5	
+0x7353	0x23C3C	
+0x7354	0x24137	
+0x7355	0x2413A	
+0x7356	0x244BB	
+0x7358	0x24710	
+0x7359	0x2470D	
+0x735A	0x24BAF	
+0x735B	0x24C11	
+0x735D	0x24F0D	
+0x735E	0x24F0C	
+0x735F	0x24F0B	
+0x7360	0x250D4	
+0x7361	0x2533D	
+0x7362	0x2533E	
+0x7363	0x2533B	
+0x7364	0x25343	
+0x7365	0x25340	
+0x7366	0x25346	
+0x7367	0x25411	
+0x7368	0x255DD	
+0x7369	0x255DF	
+0x736A	0x255EA	
+0x736B	0x2574A	
+0x736C	0x25906	
+0x736D	0x25DC1	
+0x736E	0x25DB9	
+0x736F	0x25DC6	
+0x7370	0x25DB8	
+0x7371	0x25DBB	
+0x7372	0x25DC8	
+0x7373	0x25DC5	
+0x7374	0x25DBF	
+0x7375	0x25DC7	
+0x7376	0x25DC4	
+0x7377	0x25F65	
+0x7378	0x25F67	
+0x7379	0x261D7	
+0x737A	0x261DB	
+0x737B	0x261D4	
+0x737C	0x261D6	
+0x737D	0x263E8	
+0x737E	0x2660A	
+0x7421	0x26ABD	
+0x7422	0x26ABE	
+0x7423	0x2711A	
+0x7424	0x2710D	
+0x7425	0x2710F	
+0x7426	0x2711B	
+0x7427	0x27110	
+0x7428	0x27111	
+0x7429	0x27113	
+0x742A	0x27218	
+0x742B	0x27520	
+0x742C	0x2751F	
+0x742D	0x27523	
+0x742E	0x2751D	
+0x742F	0x27537	
+0x7430	0x27525	
+0x7431	0x27524	
+0x7432	0x2752A	
+0x7433	0x27527	
+0x7434	0x27533	
+0x7435	0x27528	
+0x7436	0x27534	
+0x7437	0x277BA	
+0x7439	0x2789D	
+0x743A	0x2794C	
+0x743B	0x27B5C	
+0x743C	0x27B6A	
+0x743D	0x27B5D	
+0x743E	0x27B65	
+0x743F	0x27B63	
+0x7440	0x27B5E	
+0x7441	0x27C19	
+0x7442	0x27C97	
+0x7443	0x27E3F	
+0x7444	0x27E33	
+0x7445	0x27E32	
+0x7446	0x27FA1	
+0x7447	0x27FA5	
+0x7448	0x27FA4	
+0x7449	0x27FA2	
+0x744A	0x281C1	
+0x744C	0x281C7	
+0x744D	0x281C4	
+0x744E	0x281C6	
+0x744F	0x281C5	
+0x7450	0x281D4	
+0x7451	0x281CA	
+0x7452	0x28653	
+0x7453	0x288F1	
+0x7454	0x28921	
+0x7456	0x28BB7	
+0x7457	0x28B92	
+0x7458	0x28DD4	
+0x7459	0x28F44	
+0x745A	0x29198	
+0x745B	0x2919B	
+0x745C	0x29191	
+0x745D	0x29195	
+0x745E	0x2919A	
+0x745F	0x29192	
+0x7460	0x29353	
+0x7461	0x29357	
+0x7463	0x2935C	
+0x7464	0x2935D	
+0x7465	0x29364	
+0x7466	0x293EA	
+0x7467	0x293ED	
+0x7468	0x29442	
+0x7469	0x29443	
+0x746A	0x29564	
+0x746B	0x29561	
+0x746C	0x29560	
+0x746D	0x2967D	
+0x746E	0x297D4	
+0x746F	0x297D5	
+0x7470	0x297D9	
+0x7471	0x29987	
+0x7472	0x29999	
+0x7473	0x2998C	
+0x7474	0x2998A	
+0x7475	0x2998F	
+0x7477	0x2998B	
+0x7478	0x29982	
+0x7479	0x2999B	
+0x747B	0x29BC8	
+0x747C	0x29BC4	
+0x747D	0x29BCC	
+0x747E	0x29BC7	
+0x7521	0x29BC3	
+0x7522	0x29BC6	
+0x7523	0x29BCB	
+0x7524	0x29BCA	
+0x7525	0x29BC9	
+0x7526	0x29BCD	
+0x7527	0x29C53	
+0x7528	0x29D21	
+0x7529	0x29D29	
+0x752A	0x29D1D	
+0x752B	0x29D24	
+0x752C	0x29D28	
+0x752E	0x29EB1	
+0x752F	0x29EB2	
+0x7530	0x29EB5	
+0x7531	0x29ED6	
+0x7532	0x29EAF	
+0x7533	0x29ECA	
+0x7534	0x29EB8	
+0x7535	0x2FA12	
+0x7536	0x2FA11	
+0x7537	0x2A145	
+0x7538	0x2A147	
+0x7539	0x2A134	
+0x753A	0x2A16E	
+0x753B	0x2A142	
+0x753C	0x2A131	
+0x753D	0x2A12E	
+0x753E	0x2A156	
+0x753F	0x2A138	
+0x7540	0x2A137	
+0x7541	0x2A14B	
+0x7542	0x2A12D	
+0x7543	0x2A133	
+0x7544	0x2A136	
+0x7546	0x2A148	
+0x7547	0x2A2DC	
+0x7549	0x2A366	
+0x754A	0x2A36D	
+0x754B	0x2A363	
+0x754C	0x2A364	
+0x754E	0x2A367	
+0x754F	0x2A3D9	
+0x7550	0x2A40B	
+0x7551	0x2A47E	
+0x7552	0x2A48B	
+0x7553	0x2A526	
+0x7554	0x2A52C	
+0x7555	0x2A529	
+0x7556	0x2A56F	
+0x7557	0x2A56B	
+0x7558	0x2A56D	
+0x7559	0x2A56E	
+0x755A	0x2A61C	
+0x755B	0x2A611	
+0x755C	0x2A610	
+0x755D	0x2A624	
+0x755E	0x2A612	
+0x755F	0x2A615	
+0x7560	0x2A617	
+0x7562	0x2046F	
+0x7563	0x205AB	
+0x7564	0x2082E	
+0x7565	0x208C9	
+0x7566	0x20B96	
+0x7567	0x21185	
+0x7568	0x216A0	
+0x7569	0x2192B	
+0x756A	0x2230D	
+0x756B	0x23036	
+0x756F	0x233B1	
+0x7570	0x2384A	
+0x7571	0x23837	
+0x7572	0x2383C	
+0x7573	0x23838	
+0x7574	0x2383A	
+0x7575	0x2383E	
+0x7576	0x23849	
+0x7579	0x23A80	
+0x757A	0x23A7F	
+0x757B	0x23AE3	
+0x757C	0x23C3F	
+0x757D	0x24152	
+0x757E	0x2414E	
+0x7621	0x2414A	
+0x7622	0x2414B	
+0x7623	0x244D5	
+0x7624	0x24AD8	
+0x7625	0x24B20	
+0x7626	0x24BB3	
+0x7627	0x24BB1	
+0x7628	0x24BB0	
+0x7629	0x24F17	
+0x762A	0x250D9	
+0x762B	0x25349	
+0x762C	0x25413	
+0x762D	0x255ED	
+0x762E	0x255EB	
+0x762F	0x255EE	
+0x7630	0x2590A	
+0x7631	0x2590B	
+0x7632	0x25A4A	
+0x7633	0x25DD5	
+0x7634	0x25DD7	
+0x7635	0x25DDE	
+0x7636	0x25DDC	
+0x7637	0x25DEE	
+0x7638	0x25F70	
+0x763A	0x261D9	
+0x763B	0x263D7	
+0x763C	0x268CB	
+0x763D	0x268C7	
+0x763E	0x269FC	
+0x763F	0x2713B	
+0x7640	0x27139	
+0x7641	0x2714B	
+0x7642	0x27143	
+0x7643	0x27140	
+0x7644	0x27146	
+0x7645	0x2754D	
+0x7646	0x27543	
+0x7647	0x27547	
+0x7648	0x2754B	
+0x7649	0x27555	
+0x764A	0x27552	
+0x764B	0x27B5F	
+0x764D	0x27B7C	
+0x764E	0x27B7B	
+0x764F	0x27FA8	
+0x7650	0x27FA9	
+0x7651	0x281DE	
+0x7652	0x281D7	
+0x7653	0x281DD	
+0x7654	0x281D6	
+0x7655	0x281D8	
+0x7656	0x2829B	
+0x7657	0x283E0	
+0x7658	0x283E8	
+0x7659	0x283E6	
+0x765A	0x288F8	
+0x765B	0x288FB	
+0x765C	0x28BBB	
+0x765E	0x28BB8	
+0x7660	0x28CC1	
+0x7661	0x28CC0	
+0x7662	0x291A4	
+0x7663	0x291AB	
+0x7664	0x2924D	
+0x7665	0x29365	
+0x7666	0x29367	
+0x7667	0x2936A	
+0x7668	0x29366	
+0x7669	0x29369	
+0x766A	0x29573	
+0x766B	0x29580	
+0x766C	0x2956F	
+0x766D	0x29571	
+0x766E	0x297E4	
+0x766F	0x297E6	
+0x7670	0x297E7	
+0x7671	0x299A0	
+0x7672	0x299A4	
+0x7673	0x29AA2	
+0x7674	0x29AA7	
+0x7675	0x29AA4	
+0x7676	0x29BDE	
+0x7677	0x29BDB	
+0x7678	0x29C58	
+0x7679	0x29C5C	
+0x767A	0x29D2F	
+0x767B	0x29D2E	
+0x767C	0x29EDD	
+0x767D	0x29EE4	
+0x767E	0x29ED8	
+0x7721	0x29EE7	
+0x7722	0x29EDA	
+0x7723	0x29E75	
+0x7725	0x2A179	
+0x7726	0x2A180	
+0x7727	0x2A17F	
+0x7728	0x2A17C	
+0x7729	0x2A175	
+0x772A	0x2A17B	
+0x772B	0x2A182	
+0x772D	0x2A189	
+0x772E	0x2A174	
+0x772F	0x2A17D	
+0x7730	0x2A17A	
+0x7731	0x2A186	
+0x7732	0x2A1A8	
+0x7733	0x2A172	
+0x7735	0x2A18B	
+0x7736	0x2A191	
+0x7737	0x2A1B3	
+0x7738	0x2A181	
+0x7739	0x2A282	
+0x773A	0x2A2E1	
+0x773B	0x2A2E3	
+0x773C	0x2A2E2	
+0x773D	0x2A376	
+0x773E	0x2A374	
+0x773F	0x2A372	
+0x7740	0x2A375	
+0x7741	0x2A40E	
+0x7742	0x2A40D	
+0x7743	0x2A494	
+0x7744	0x2A492	
+0x7745	0x2A493	
+0x7746	0x2A491	
+0x7747	0x2A48F	
+0x7748	0x2A495	
+0x7749	0x2A4D0	
+0x774A	0x2A4F7	
+0x774B	0x2A576	
+0x774C	0x2A5AF	
+0x774E	0x2A626	
+0x774F	0x2A625	
+0x7750	0x2A62D	
+0x7751	0x2A6A0	
+0x7752	0x2A6C3	
+0x7753	0x204D7	
+0x7754	0x20ACC	
+0x7755	0x21179	
+0x7756	0x2117A	
+0x7757	0x21515	
+0x7758	0x21FDB	
+0x7759	0x22185	
+0x775A	0x22970	
+0x775B	0x2297B	
+0x775C	0x22EA5	
+0x775D	0x22E9F	
+0x775E	0x23317	
+0x775F	0x233B2	
+0x7760	0x23839	
+0x7761	0x23840	
+0x7762	0x2384E	
+0x7763	0x2393E	
+0x7764	0x23AE8	
+0x7765	0x23AE7	
+0x7766	0x24166	
+0x7767	0x24161	
+0x7768	0x244DA	
+0x7769	0x24714	
+0x776A	0x248DF	
+0x776B	0x24F18	
+0x776C	0x25039	
+0x776D	0x2503A	
+0x776E	0x25730	
+0x776F	0x25732	
+0x7770	0x2590E	
+0x7771	0x25A4C	
+0x7772	0x25DE8	
+0x7773	0x25DF1	
+0x7774	0x25DEB	
+0x7775	0x25DEC	
+0x7776	0x25F74	
+0x7777	0x25F73	
+0x7778	0x261F1	
+0x7779	0x26342	
+0x777A	0x2633E	
+0x777B	0x26341	
+0x777C	0x2652C	
+0x777D	0x268D2	
+0x777E	0x269BB	
+0x7821	0x27158	
+0x7822	0x27157	
+0x7823	0x27156	
+0x7824	0x2715A	
+0x7826	0x27561	
+0x7827	0x27568	
+0x7828	0x27565	
+0x7829	0x2755F	
+0x782A	0x27564	
+0x782B	0x2755E	
+0x782C	0x2755B	
+0x782D	0x27567	
+0x782E	0x277C3	
+0x782F	0x278A2	
+0x7830	0x27953	
+0x7831	0x27B7D	
+0x7832	0x27C20	
+0x7833	0x27FAE	
+0x7834	0x27FAF	
+0x7835	0x27FB0	
+0x7836	0x281E7	
+0x7837	0x281E6	
+0x7838	0x281E9	
+0x7839	0x283F1	
+0x783A	0x283EB	
+0x783B	0x283EA	
+0x783C	0x283E9	
+0x783D	0x28663	
+0x783E	0x28902	
+0x783F	0x288FE	
+0x7840	0x28BDE	
+0x7841	0x28CC2	
+0x7842	0x28DE6	
+0x7843	0x28F5D	
+0x7844	0x291AD	
+0x7845	0x29375	
+0x7846	0x29372	
+0x7847	0x29377	
+0x7849	0x29651	
+0x784A	0x297E8	
+0x784B	0x297ED	
+0x784C	0x297EE	
+0x784D	0x299B9	
+0x784E	0x299A1	
+0x784F	0x299B6	
+0x7850	0x29AAE	
+0x7851	0x29BE8	
+0x7853	0x29C1E	
+0x7854	0x29D31	
+0x7855	0x29D32	
+0x7857	0x29F0E	
+0x7858	0x29F12	
+0x7859	0x29F09	
+0x785A	0x29F05	
+0x785C	0x29F03	
+0x785D	0x29F1F	
+0x785E	0x29F0D	
+0x785F	0x29F0C	
+0x7860	0x29F04	
+0x7861	0x29F0A	
+0x7862	0x2A1C2	
+0x7863	0x2A1BF	
+0x7864	0x2A1C9	
+0x7865	0x2A1B2	
+0x7866	0x2A1C1	
+0x7867	0x2A1AF	
+0x7868	0x2A1B4	
+0x7869	0x2A1B0	
+0x786A	0x2A1B6	
+0x786B	0x2A1B7	
+0x786C	0x2A1BB	
+0x786D	0x2A1B1	
+0x786E	0x2A2F0	
+0x786F	0x2A378	
+0x7870	0x2A37A	
+0x7871	0x2A379	
+0x7872	0x2A3E4	
+0x7873	0x2A3E6	
+0x7874	0x2A49F	
+0x7875	0x2A49D	
+0x7876	0x2A498	
+0x7877	0x2A499	
+0x7878	0x2A4F9	
+0x7879	0x2A530	
+0x787A	0x2A582	
+0x787B	0x2A581	
+0x787C	0x2A5B3	
+0x787D	0x2A57F	
+0x787E	0x2A63A	
+0x7921	0x2A63E	
+0x7922	0x2A648	
+0x7923	0x21186	
+0x7924	0x21936	
+0x7925	0x21B13	
+0x7926	0x21C22	
+0x7927	0x21FDD	
+0x7928	0x225A7	
+0x7929	0x2297D	
+0x792B	0x2331C	
+0x792C	0x23865	
+0x792D	0x23860	
+0x792E	0x23867	
+0x7930	0x23B1A	
+0x7931	0x24AE3	
+0x7932	0x25734	
+0x7933	0x25918	
+0x7934	0x25A52	
+0x7935	0x25DFC	
+0x7936	0x25F79	
+0x7937	0x25F78	
+0x7938	0x25F76	
+0x7939	0x261FA	
+0x793A	0x261F8	
+0x793B	0x2652D	
+0x793C	0x268D6	
+0x793D	0x269BD	
+0x793E	0x269BF	
+0x793F	0x269BE	
+0x7940	0x27144	
+0x7941	0x27170	
+0x7942	0x27162	
+0x7943	0x2716E	
+0x7944	0x2756E	
+0x7945	0x2757C	
+0x7946	0x27574	
+0x7947	0x27578	
+0x7948	0x27570	
+0x7949	0x27579	
+0x794A	0x27571	
+0x794B	0x277CC	
+0x794C	0x278A7	
+0x794D	0x278A6	
+0x794E	0x27B93	
+0x794F	0x27C21	
+0x7950	0x27C9C	
+0x7951	0x2829D	
+0x7952	0x283F4	
+0x7953	0x283F3	
+0x7954	0x28DF0	
+0x7955	0x291B8	
+0x7956	0x291B6	
+0x7957	0x291BD	
+0x7958	0x29373	
+0x7959	0x29382	
+0x795A	0x29587	
+0x795B	0x29656	
+0x795C	0x29659	
+0x795D	0x297F6	
+0x795E	0x299C9	
+0x795F	0x299C5	
+0x7960	0x299C7	
+0x7961	0x299CA	
+0x7962	0x299C2	
+0x7963	0x299C4	
+0x7964	0x29BF2	
+0x7965	0x29BF0	
+0x7966	0x29D3B	
+0x7967	0x29D3A	
+0x7968	0x29F26	
+0x7969	0x29F28	
+0x796A	0x29F34	
+0x796B	0x29F2D	
+0x796C	0x2A1D7	
+0x796D	0x2A1D2	
+0x796E	0x2A1D6	
+0x796F	0x2A1DC	
+0x7970	0x2A1D3	
+0x7971	0x2A1D1	
+0x7972	0x2A286	
+0x7974	0x2A2EF	
+0x7975	0x2A2EE	
+0x7976	0x2A3E8	
+0x7977	0x2A4AC	
+0x7978	0x2A4A9	
+0x7979	0x2A4AA	
+0x797A	0x2A4AB	
+0x797B	0x2A4FB	
+0x797C	0x2A533	
+0x797D	0x2A588	
+0x797E	0x2A5B6	
+0x7A21	0x2A5B7	
+0x7A22	0x2A5D0	
+0x7A23	0x2A5CF	
+0x7A24	0x2A64F	
+0x7A25	0x2A659	
+0x7A26	0x2A64C	
+0x7A27	0x21B18	
+0x7A28	0x21FE0	
+0x7A29	0x23869	
+0x7A2A	0x24173	
+0x7A2B	0x24172	
+0x7A2C	0x24AE8	
+0x7A2D	0x255FB	
+0x7A2E	0x2591C	
+0x7A2F	0x25E09	
+0x7A30	0x25E0A	
+0x7A31	0x25E08	
+0x7A32	0x25F7D	
+0x7A33	0x25F7F	
+0x7A34	0x26267	
+0x7A35	0x2717A	
+0x7A36	0x2717B	
+0x7A37	0x277D1	
+0x7A38	0x2F9CB	
+0x7A39	0x27B9D	
+0x7A3A	0x27C9D	
+0x7A3B	0x281FC	
+0x7A3C	0x281FB	
+0x7A3D	0x281FD	
+0x7A3E	0x283F5	
+0x7A3F	0x283F6	
+0x7A40	0x28C0F	
+0x7A41	0x28C1D	
+0x7A42	0x291C7	
+0x7A43	0x291C1	
+0x7A44	0x291BF	
+0x7A45	0x29254	
+0x7A46	0x2937F	
+0x7A47	0x293F5	
+0x7A48	0x2958A	
+0x7A49	0x2958C	
+0x7A4A	0x2965C	
+0x7A4B	0x29865	
+0x7A4C	0x299CF	
+0x7A4D	0x299D0	
+0x7A4E	0x29AB8	
+0x7A4F	0x29BFA	
+0x7A50	0x29C66	
+0x7A51	0x29F40	
+0x7A52	0x29F41	
+0x7A54	0x2A1F7	
+0x7A55	0x2A1F3	
+0x7A56	0x2A1EF	
+0x7A57	0x2A1F4	
+0x7A58	0x2A1ED	
+0x7A59	0x2A1F2	
+0x7A5A	0x2A1F1	
+0x7A5B	0x2A1F9	
+0x7A5C	0x2A4B4	
+0x7A5D	0x2A4FC	
+0x7A5E	0x2A5BC	
+0x7A5F	0x2A65E	
+0x7A60	0x2A65B	
+0x7A61	0x2A65F	
+0x7A62	0x2A65D	
+0x7A63	0x2A6CF	
+0x7A64	0x2A6CE	
+0x7A65	0x2193A	
+0x7A66	0x21FE1	
+0x7A67	0x22315	
+0x7A68	0x22314	
+0x7A69	0x24178	
+0x7A6A	0x24179	
+0x7A6B	0x244E6	
+0x7A6C	0x24BB8	
+0x7A6D	0x24F22	
+0x7A6E	0x255FE	
+0x7A6F	0x268DB	
+0x7A70	0x26A06	
+0x7A71	0x26AC8	
+0x7A72	0x27189	
+0x7A73	0x27586	
+0x7A74	0x278AD	
+0x7A75	0x27B99	
+0x7A76	0x27BD8	
+0x7A77	0x27C23	
+0x7A78	0x27D23	
+0x7A79	0x27FB5	
+0x7A7A	0x283F9	
+0x7A7B	0x28907	
+0x7A7C	0x28C1E	
+0x7A7D	0x28DFB	
+0x7A7E	0x28F72	
+0x7B21	0x28F73	
+0x7B22	0x29387	
+0x7B23	0x29449	
+0x7B24	0x2965D	
+0x7B25	0x297F8	
+0x7B26	0x29C03	
+0x7B27	0x29F4E	
+0x7B28	0x29F4D	
+0x7B29	0x29F50	
+0x7B2A	0x29F55	
+0x7B2B	0x2A209	
+0x7B2C	0x2A207	
+0x7B2D	0x2A20C	
+0x7B2E	0x2A203	
+0x7B2F	0x2A206	
+0x7B30	0x2A20B	
+0x7B31	0x2A20A	
+0x7B32	0x2A289	
+0x7B33	0x2A4BB	
+0x7B34	0x2A4FF	
+0x7B35	0x2A536	
+0x7B36	0x2A58B	
+0x7B37	0x2A666	
+0x7B38	0x2A669	
+0x7B39	0x2A667	
+0x7B3A	0x2A6C2	
+0x7B3B	0x2A6D2	
+0x7B3C	0x21FE2	
+0x7B3E	0x22988	
+0x7B3F	0x2335B	
+0x7B40	0x23876	
+0x7B41	0x2417D	
+0x7B42	0x245A6	
+0x7B43	0x2535A	
+0x7B44	0x25E17	
+0x7B45	0x268DC	
+0x7B46	0x2718F	
+0x7B47	0x27594	
+0x7B48	0x27595	
+0x7B49	0x27FB6	
+0x7B4A	0x28204	
+0x7B4B	0x287EE	
+0x7B4C	0x2938A	
+0x7B4D	0x293F9	
+0x7B4E	0x29C07	
+0x7B4F	0x29C1F	
+0x7B50	0x29C2A	
+0x7B51	0x29D45	
+0x7B52	0x29F5C	
+0x7B53	0x29F5B	
+0x7B54	0x29F61	
+0x7B55	0x29F5D	
+0x7B56	0x2A218	
+0x7B57	0x2A21F	
+0x7B58	0x2A383	
+0x7B59	0x2A416	
+0x7B5A	0x2A414	
+0x7B5B	0x2A4BF	
+0x7B5C	0x2A4C0	
+0x7B5D	0x2A673	
+0x7B5E	0x2A6C0	
+0x7B5F	0x21517	
+0x7B60	0x22989	
+0x7B61	0x2591E	
+0x7B62	0x2591F	
+0x7B63	0x25A54	
+0x7B64	0x25E18	
+0x7B65	0x26205	
+0x7B66	0x27195	
+0x7B67	0x27598	
+0x7B68	0x2759B	
+0x7B69	0x27959	
+0x7B6A	0x28208	
+0x7B6B	0x28401	
+0x7B6C	0x291CE	
+0x7B6D	0x293FA	
+0x7B6E	0x29ABE	
+0x7B6F	0x29D47	
+0x7B70	0x29F6A	
+0x7B71	0x29F69	
+0x7B72	0x29F68	
+0x7B73	0x29F67	
+0x7B74	0x2A225	
+0x7B75	0x2A228	
+0x7B76	0x2A4C4	
+0x7B77	0x2A537	
+0x7B78	0x2A58D	
+0x7B79	0x2A58C	
+0x7B7B	0x2F920	
+0x7B7C	0x25E22	
+0x7B7D	0x25F82	
+0x7B7E	0x277D9	
+0x7C21	0x28C38	
+0x7C22	0x293FB	
+0x7C23	0x299E1	
+0x7C24	0x29C72	
+0x7C25	0x29D48	
+0x7C26	0x29F6C	
+0x7C27	0x29F70	
+0x7C28	0x2A231	
+0x7C29	0x2A230	
+0x7C2A	0x2A679	
+0x7C2B	0x25E23	
+0x7C2C	0x268F8	
+0x7C2D	0x29C74	
+0x7C2E	0x29F73	
+0x7C2F	0x2A234	
+0x7C30	0x2A387	
+0x7C31	0x2A3B2	
+0x7C32	0x2A5C2	
+0x7C33	0x2A67D	
+0x7C34	0x21FE5	
+0x7C35	0x2938C	
+0x7C36	0x29F77	
+0x7C37	0x29F75	
+0x7C38	0x2A238	
+0x7C39	0x2A23A	
+0x7C3A	0x2A683	
+0x7C3B	0x2A681	
+0x7C3C	0x24180	
+0x7C3D	0x27199	
+0x7C3F	0x2944A	
+0x7C40	0x29D4A	
+0x7C41	0x2A23C	
+0x7C42	0x2A6C8	
+0x7C43	0x25604	
+0x7C44	0x278AF	
+0x7C45	0x2A689	
+0x7C46	0x2A2FA	
+0x7C47	0x29661	
+0x7C48	0x2A23F	
+0x7C49	0x27193	
+0x7C4A	0x2A4C9	
+0x7C4B	0x277DE	
+0x7C4C	0x29391	
+0x7C4D	0x2A68E	
+0x7C4E	0x2A68D	
+0x7C4F	0x27198	
+0x7C50	0x269C5	
+0x7C51	0x2A6A5	
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates
new file mode 100644
index 0000000..f6c9f67
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates
@@ -0,0 +1,6158 @@
+0x2121	0x2F802
+0x2122	0x20062
+0x2124	0x20088
+0x2125	0x200D0
+0x2126	0x200CF
+0x2127	0x2011E
+0x2128	0x2011F
+0x2129	0x20120
+0x212A	0x2090E
+0x212B	0x2092C
+0x212C	0x20061
+0x212D	0x20004
+0x212E	0x20005
+0x212F	0x20003
+0x2131	0x2F801
+0x2132	0x2007D
+0x2133	0x2008D
+0x2134	0x201A3
+0x2135	0x201A4
+0x2136	0x204DB
+0x2137	0x20500
+0x2138	0x2F81E
+0x2139	0x206A3
+0x213A	0x20832
+0x213C	0x20AD4
+0x213D	0x20AD5
+0x213E	0x21C23
+0x213F	0x2232C
+0x2140	0x2237A
+0x2141	0x20503
+0x2142	0x20007
+0x2143	0x20008
+0x2144	0x2008F
+0x2145	0x2009C
+0x2146	0x200D5
+0x2147	0x20112
+0x2148	0x20113
+0x2149	0x20114
+0x214A	0x20121
+0x214B	0x201A8
+0x214C	0x201A6
+0x214D	0x20476
+0x214E	0x20501
+0x214F	0x2053D
+0x2150	0x2F814
+0x2151	0x2053E
+0x2152	0x20629
+0x2153	0x20677
+0x2154	0x20678
+0x2155	0x206A6
+0x2156	0x206A9
+0x2157	0x206AC
+0x2158	0x20834
+0x2159	0x20504
+0x215A	0x2097B
+0x215B	0x20A10
+0x215C	0x2062F
+0x215D	0x20AD7
+0x215E	0x20B1C
+0x215F	0x20B1F
+0x2160	0x20B1A
+0x2161	0x2F836
+0x2162	0x20B1E
+0x2163	0x20B9E
+0x2164	0x20B9A
+0x2165	0x211A0
+0x2166	0x211A1
+0x2167	0x215D2
+0x2168	0x215D3
+0x2169	0x219B9
+0x216A	0x21B1D
+0x216B	0x21B55
+0x216C	0x21CFF
+0x216D	0x21FE7
+0x216F	0x22011
+0x2170	0x22013
+0x2171	0x22012
+0x2172	0x221AF
+0x2173	0x221B1
+0x2174	0x2F890
+0x2175	0x2232D
+0x2176	0x2237B
+0x2177	0x2239D
+0x2178	0x2239A
+0x217A	0x2239F
+0x217B	0x223A0
+0x217C	0x2239C
+0x217D	0x224BD
+0x2221	0x225AA
+0x2222	0x2306C
+0x2223	0x23091
+0x2224	0x23C74
+0x2225	0x2456A
+0x2226	0x2F929
+0x2227	0x25605
+0x2228	0x2626B
+0x2229	0x2626A
+0x222A	0x200E0
+0x222B	0x20012
+0x222D	0x2007F
+0x222E	0x200A0
+0x222F	0x20099
+0x2230	0x20095
+0x2231	0x2009E
+0x2232	0x200DF
+0x2233	0x200DE
+0x2234	0x201AF
+0x2235	0x201AD
+0x2236	0x201B0
+0x2237	0x204DF
+0x2238	0x20543
+0x2239	0x20541
+0x223A	0x20548
+0x223B	0x20575
+0x223C	0x2F81A
+0x223D	0x20632
+0x223E	0x2067B
+0x223F	0x20679
+0x2240	0x206B3
+0x2242	0x20BA7
+0x2243	0x206B2
+0x2244	0x206B0
+0x2245	0x206B4
+0x2246	0x2F829
+0x2247	0x208CD
+0x2248	0x208CE
+0x2249	0x2F82B
+0x224A	0x20910
+0x224B	0x20980
+0x224C	0x209D3
+0x224D	0x20A30
+0x224E	0x20098
+0x224F	0x20A2F
+0x2250	0x20A31
+0x2251	0x20ADA
+0x2252	0x20AD9
+0x2253	0x20B27
+0x2254	0x20B28
+0x2255	0x20B21
+0x2256	0x20B25
+0x2257	0x20BA6
+0x2258	0x20BA2
+0x2259	0x20BA1
+0x225A	0x20BA4
+0x225B	0x2F839
+0x225C	0x20BAA
+0x225D	0x20BA5
+0x225E	0x20BA3
+0x225F	0x20064
+0x2260	0x2123F
+0x2261	0x21244
+0x2262	0x2151B
+0x2263	0x21553
+0x2264	0x21584
+0x2265	0x21586
+0x2266	0x215D5
+0x2267	0x2F860
+0x2268	0x2193E
+0x2269	0x21940
+0x226A	0x21BCA
+0x226B	0x21BC9
+0x226C	0x21C26
+0x226D	0x21D00
+0x226E	0x21D31
+0x226F	0x21D3C
+0x2270	0x21D30
+0x2271	0x21D33
+0x2272	0x21D32
+0x2273	0x21D38
+0x2274	0x22034
+0x2275	0x22053
+0x2276	0x22054
+0x2277	0x221B4
+0x2278	0x221B2
+0x2279	0x2232F
+0x227A	0x223A5
+0x227B	0x223A7
+0x227C	0x223A4
+0x227D	0x223A8
+0x227E	0x223A9
+0x2321	0x223A2
+0x2322	0x223A3
+0x2323	0x223A6
+0x2324	0x22481
+0x2325	0x22480
+0x2326	0x225AD
+0x2327	0x22A24
+0x2328	0x22A65
+0x2329	0x22A68
+0x232A	0x22A69
+0x232B	0x2313C
+0x232C	0x2313B
+0x232D	0x2335D
+0x232E	0x23944
+0x232F	0x24182
+0x2330	0x244F1
+0x2331	0x2456B
+0x2332	0x2471B
+0x2333	0x248EB
+0x2334	0x24BBA
+0x2335	0x24BD3
+0x2336	0x24D13
+0x2337	0x25922
+0x2338	0x26AF4
+0x2339	0x2820F
+0x233A	0x28210
+0x233B	0x20507
+0x233C	0x29C0B
+0x233D	0x29C0A
+0x233E	0x20019
+0x233F	0x2001A
+0x2340	0x20018
+0x2341	0x20066
+0x2342	0x20082
+0x2343	0x200A8
+0x2344	0x200E5
+0x2345	0x200E7
+0x2346	0x200E4
+0x2347	0x20115
+0x2348	0x20123
+0x2349	0x20124
+0x234A	0x20143
+0x234B	0x201C3
+0x234C	0x201BC
+0x234D	0x201BB
+0x234F	0x201B7
+0x2350	0x201B9
+0x2351	0x201CF
+0x2352	0x2F80D
+0x2353	0x2047A
+0x2354	0x2047B
+0x2355	0x204E1
+0x2356	0x204E0
+0x2357	0x20509
+0x2358	0x2054D
+0x2359	0x2F816
+0x235A	0x2054B
+0x235B	0x20579
+0x235C	0x205B1
+0x235D	0x20636
+0x235E	0x20635
+0x235F	0x20637
+0x2360	0x20638
+0x2361	0x2067F
+0x2362	0x20680
+0x2363	0x20681
+0x2364	0x26953
+0x2365	0x2067E
+0x2366	0x206CD
+0x2367	0x206BF
+0x2368	0x206BE
+0x2369	0x206C2
+0x236A	0x206B8
+0x236B	0x206C1
+0x236D	0x20931
+0x236E	0x2092F
+0x236F	0x2096F
+0x2370	0x20982
+0x2372	0x20987
+0x2373	0x20986
+0x2374	0x2098D
+0x2375	0x20994
+0x2376	0x209D7
+0x2377	0x209D4
+0x2378	0x209D8
+0x2379	0x20A16
+0x237A	0x20A14
+0x237B	0x20A2E
+0x237C	0x20A36
+0x237D	0x20A37
+0x237E	0x21FEE
+0x2421	0x20AE0
+0x2422	0x20AE5
+0x2423	0x20ADF
+0x2424	0x20B2B
+0x2425	0x20B29
+0x2426	0x20B2D
+0x2427	0x20B2F
+0x2428	0x20BB7
+0x2429	0x20BC9
+0x242A	0x20BC1
+0x242B	0x20BCA
+0x242C	0x20BB2
+0x242D	0x20BAC
+0x242E	0x20BAE
+0x242F	0x211B2
+0x2430	0x211A8
+0x2431	0x211B0
+0x2432	0x211A7
+0x2433	0x2F851
+0x2434	0x21252
+0x2435	0x2124A
+0x2436	0x21556
+0x2437	0x21555
+0x2438	0x2155F
+0x2439	0x2155E
+0x243A	0x21588
+0x243B	0x2F85D
+0x243C	0x215DD
+0x243D	0x215E2
+0x243E	0x215E1
+0x243F	0x215DF
+0x2440	0x215E0
+0x2441	0x216AF
+0x2442	0x216B1
+0x2443	0x216BA
+0x2444	0x21945
+0x2445	0x21943
+0x2446	0x219BD
+0x2447	0x219C8
+0x2448	0x2F86C
+0x2449	0x219BE
+0x244A	0x219BF
+0x244B	0x2F874
+0x244C	0x21B59
+0x244D	0x21C29
+0x244E	0x21C2C
+0x244F	0x21C2F
+0x2450	0x21C2D
+0x2451	0x21C2E
+0x2452	0x21D04
+0x2453	0x21D02
+0x2454	0x21D01
+0x2455	0x21D40
+0x2456	0x21D4A
+0x2457	0x21D3F
+0x2458	0x21D4F
+0x2459	0x21D41
+0x245A	0x21D4E
+0x245B	0x21FEB
+0x245C	0x21FEC
+0x245D	0x200AC
+0x245E	0x2205B
+0x245F	0x22063
+0x2460	0x2205A
+0x2461	0x22059
+0x2462	0x221DC
+0x2463	0x221DB
+0x2464	0x221D9
+0x2465	0x221E0
+0x2466	0x221DD
+0x2467	0x20020
+0x2468	0x223B0
+0x2469	0x223B1
+0x246A	0x223B2
+0x246B	0x223B6
+0x246C	0x22451
+0x246D	0x22452
+0x246E	0x22450
+0x246F	0x22484
+0x2471	0x22483
+0x2472	0x225C3
+0x2473	0x225B8
+0x2474	0x225B9
+0x2475	0x225B2
+0x2476	0x22990
+0x2477	0x22A26
+0x2478	0x22A29
+0x2479	0x22A6E
+0x247A	0x23140
+0x247B	0x2313E
+0x247C	0x23141
+0x247D	0x2335E
+0x247E	0x233BB
+0x2521	0x233BC
+0x2522	0x233B9
+0x2523	0x2F8EF
+0x2524	0x23880
+0x2526	0x23945
+0x2527	0x239BA
+0x2528	0x239BD
+0x2529	0x23C56
+0x252A	0x23C55
+0x252B	0x23C75
+0x252C	0x23C77
+0x252D	0x23C81
+0x252E	0x2F8FA
+0x252F	0x23C83
+0x2530	0x23C8B
+0x2531	0x23C84
+0x2532	0x24186
+0x2533	0x24183
+0x2534	0x2418B
+0x2535	0x2456D
+0x2536	0x24616
+0x2537	0x24728
+0x2538	0x248EA
+0x2539	0x24BD4
+0x253A	0x24C03
+0x253B	0x24D15
+0x253C	0x24F3D
+0x253D	0x24F3E
+0x253E	0x25416
+0x253F	0x2F94C
+0x2540	0x25606
+0x2541	0x2574D
+0x2542	0x26222
+0x2543	0x26273
+0x2544	0x2626D
+0x2545	0x2626E
+0x2546	0x264B1
+0x2547	0x2054E
+0x2548	0x2662D
+0x254A	0x268F9
+0x254B	0x26952
+0x254C	0x26B00
+0x254D	0x26AFC
+0x254E	0x26AFA
+0x2550	0x26AF7
+0x2551	0x26AF8
+0x2552	0x2F990
+0x2553	0x2F9C4
+0x2554	0x27C27
+0x2555	0x28211
+0x2556	0x200AE
+0x2557	0x28450
+0x2558	0x2844F
+0x2559	0x2844D
+0x255A	0x28671
+0x255B	0x2F9E2
+0x255C	0x28672
+0x255D	0x28E18
+0x255E	0x20A44
+0x255F	0x20021
+0x2560	0x20067
+0x2561	0x200AF
+0x2562	0x200B0
+0x2563	0x20029
+0x2564	0x20117
+0x2565	0x20122
+0x2566	0x2F803
+0x2567	0x20025
+0x2568	0x20128
+0x2569	0x201FF
+0x256A	0x201D9
+0x256B	0x201DB
+0x256C	0x201DE
+0x256D	0x201F2
+0x256E	0x201FE
+0x256F	0x201F4
+0x2570	0x201DD
+0x2572	0x2F804
+0x2573	0x20201
+0x2574	0x201DC
+0x2575	0x2047D
+0x2576	0x20481
+0x2577	0x2047E
+0x2578	0x2047F
+0x2579	0x204E5
+0x257A	0x2050F
+0x257C	0x2050A
+0x257E	0x2050B
+0x2621	0x20551
+0x2622	0x20552
+0x2623	0x20550
+0x2624	0x205B8
+0x2625	0x2063D
+0x2626	0x2063E
+0x2627	0x2063C
+0x2628	0x20687
+0x2629	0x206D7
+0x262A	0x206DB
+0x262B	0x206CF
+0x262C	0x206E0
+0x262D	0x2084C
+0x262E	0x20842
+0x262F	0x208D4
+0x2630	0x20911
+0x2631	0x20914
+0x2632	0x20915
+0x2633	0x20912
+0x2634	0x20933
+0x2635	0x20935
+0x2637	0x20971
+0x2639	0x20991
+0x263A	0x20993
+0x263B	0x20995
+0x263C	0x209DC
+0x263D	0x20A42
+0x263E	0x20A40
+0x263F	0x253A6
+0x2640	0x20AE6
+0x2641	0x2128F
+0x2642	0x20B32
+0x2643	0x2F837
+0x2644	0x20B31
+0x2645	0x20BF5
+0x2646	0x20BCD
+0x2647	0x20BDE
+0x2648	0x20BD5
+0x2649	0x20BDA
+0x264A	0x20BEE
+0x264B	0x20BEC
+0x264C	0x20BCF
+0x264D	0x20BCE
+0x264E	0x2F83D
+0x264F	0x20BCC
+0x2650	0x20BF3
+0x2651	0x211C1
+0x2652	0x211C4
+0x2653	0x211C6
+0x2654	0x211B4
+0x2655	0x211C3
+0x2656	0x211B8
+0x2657	0x211BB
+0x2658	0x211B7
+0x2659	0x211BC
+0x265A	0x211BF
+0x265B	0x211C7
+0x265C	0x211BE
+0x265D	0x21260
+0x265E	0x2125D
+0x265F	0x21276
+0x2660	0x2126C
+0x2661	0x21275
+0x2662	0x2125B
+0x2663	0x21271
+0x2664	0x21273
+0x2665	0x21261
+0x2666	0x2125A
+0x2667	0x21262
+0x2668	0x21272
+0x2669	0x2125F
+0x266A	0x21258
+0x266B	0x2151E
+0x266C	0x21558
+0x266D	0x2158B
+0x266E	0x2158A
+0x266F	0x215F4
+0x2670	0x215F0
+0x2671	0x216D2
+0x2672	0x216CD
+0x2673	0x216CE
+0x2674	0x216BC
+0x2675	0x216D0
+0x2676	0x21946
+0x2677	0x21947
+0x267B	0x219CE
+0x267C	0x219CF
+0x267D	0x219CC
+0x267E	0x219CB
+0x2721	0x2F872
+0x2722	0x21B60
+0x2723	0x21B5F
+0x2724	0x21B5D
+0x2725	0x21BD4
+0x2726	0x21C3A
+0x2727	0x21C38
+0x2728	0x21C3C
+0x2729	0x21C36
+0x272A	0x21D08
+0x272B	0x21D7E
+0x272C	0x21D5E
+0x272D	0x21D6E
+0x272E	0x21D53
+0x272F	0x21D70
+0x2730	0x21D57
+0x2731	0x21D5D
+0x2732	0x21D63
+0x2733	0x21D7A
+0x2734	0x21D79
+0x2735	0x21D93
+0x2736	0x2F881
+0x2737	0x2201D
+0x2738	0x22068
+0x2739	0x22073
+0x273A	0x22074
+0x273B	0x22066
+0x273C	0x2206F
+0x273D	0x22075
+0x273E	0x2207A
+0x273F	0x22070
+0x2740	0x2206D
+0x2741	0x22065
+0x2742	0x2218A
+0x2743	0x221ED
+0x2744	0x221E9
+0x2745	0x221E3
+0x2746	0x221EF
+0x2748	0x221EA
+0x2749	0x22331
+0x274A	0x2F891
+0x274B	0x22338
+0x274C	0x26B20
+0x274D	0x22335
+0x274E	0x2233A
+0x274F	0x22381
+0x2750	0x22380
+0x2751	0x223B8
+0x2752	0x223C1
+0x2753	0x223BA
+0x2754	0x22488
+0x2755	0x224CF
+0x2756	0x224CA
+0x2757	0x224C7
+0x2758	0x224C5
+0x2759	0x224C8
+0x275A	0x224D0
+0x275B	0x224C9
+0x275C	0x225BB
+0x275D	0x225B6
+0x275E	0x225BD
+0x275F	0x2F89D
+0x2760	0x225B4
+0x2761	0x225C1
+0x2762	0x225D1
+0x2763	0x225D2
+0x2764	0x225CC
+0x2765	0x225D4
+0x2766	0x225CB
+0x2767	0x225CE
+0x2768	0x225D5
+0x2769	0x225D8
+0x276A	0x22995
+0x276B	0x22993
+0x276C	0x22999
+0x276D	0x22996
+0x276F	0x22A89
+0x2770	0x22A94
+0x2771	0x22A91
+0x2772	0x22A8F
+0x2773	0x22A84
+0x2774	0x22A97
+0x2775	0x22A86
+0x2776	0x22A85
+0x2777	0x22A8C
+0x2778	0x22EF2
+0x2779	0x22EED
+0x277A	0x22EEF
+0x277B	0x230D9
+0x277C	0x23146
+0x277D	0x23147
+0x277E	0x2314B
+0x2821	0x23150
+0x2822	0x2314A
+0x2823	0x2314E
+0x2824	0x2314C
+0x2825	0x23148
+0x2826	0x23363
+0x2827	0x23361
+0x2828	0x23362
+0x2829	0x23360
+0x282A	0x233C3
+0x282B	0x233C5
+0x282C	0x233C1
+0x282D	0x233D0
+0x282E	0x2F8DC
+0x282F	0x23882
+0x2831	0x23886
+0x2832	0x23884
+0x2833	0x2394C
+0x2834	0x23948
+0x2835	0x239B8
+0x2836	0x239BF
+0x2837	0x239C1
+0x2838	0x239C6
+0x2839	0x239C5
+0x283A	0x239C7
+0x283B	0x239C0
+0x283C	0x239C3
+0x283D	0x23AED
+0x283E	0x23B03
+0x283F	0x23B22
+0x2840	0x23B21
+0x2841	0x23C9F
+0x2842	0x23C90
+0x2843	0x23C9E
+0x2845	0x23CA0
+0x2846	0x23C94
+0x2847	0x23C95
+0x2848	0x23CA1
+0x284B	0x2419A
+0x284C	0x24190
+0x284D	0x244F2
+0x284E	0x244F3
+0x284F	0x2456E
+0x2850	0x245AB
+0x2851	0x245A9
+0x2852	0x2461A
+0x2853	0x24618
+0x2854	0x2461B
+0x2855	0x24760
+0x2856	0x2474C
+0x2857	0x24742
+0x2858	0x24733
+0x2859	0x2473F
+0x285A	0x2473E
+0x285B	0x24738
+0x285C	0x24743
+0x285D	0x24746
+0x285E	0x24736
+0x285F	0x248EE
+0x2860	0x248F5
+0x2861	0x248F4
+0x2863	0x24C1B
+0x2865	0x24D2B
+0x2866	0x24D29
+0x2867	0x24D2A
+0x2868	0x24D2E
+0x2869	0x2503F
+0x286A	0x250E6
+0x286B	0x253A7
+0x286C	0x253A8
+0x286D	0x25418
+0x286E	0x25608
+0x286F	0x25750
+0x2870	0x25753
+0x2871	0x25A56
+0x2872	0x25A55
+0x2873	0x2626F
+0x2874	0x2627F
+0x2875	0x264B3
+0x2876	0x2663A
+0x2877	0x26638
+0x2878	0x26637
+0x2879	0x26636
+0x287A	0x20554
+0x287B	0x2F980
+0x287C	0x268DD
+0x287D	0x268FC
+0x287E	0x268FA
+0x2921	0x26933
+0x2922	0x26B04
+0x2923	0x26B07
+0x2924	0x26B08
+0x2925	0x26B06
+0x2926	0x26B09
+0x2927	0x2F991
+0x2928	0x2F993
+0x2929	0x2721E
+0x292A	0x2F9D2
+0x292B	0x2840B
+0x292C	0x28443
+0x292D	0x28452
+0x292E	0x28458
+0x292F	0x2845E
+0x2930	0x28668
+0x2931	0x2868D
+0x2932	0x28682
+0x2933	0x2867B
+0x2934	0x28C58
+0x2936	0x2F800
+0x2937	0x2002C
+0x2938	0x2002E
+0x2939	0x2160B
+0x293A	0x2002D
+0x293B	0x20069
+0x293C	0x200B2
+0x293D	0x200B6
+0x293E	0x200A9
+0x293F	0x200ED
+0x2940	0x20119
+0x2941	0x2014F
+0x2942	0x20216
+0x2943	0x20203
+0x2944	0x2020E
+0x2945	0x20204
+0x2946	0x20207
+0x2947	0x20210
+0x2948	0x20227
+0x2949	0x20228
+0x294A	0x2020D
+0x294B	0x20229
+0x294C	0x2020F
+0x294D	0x20222
+0x294E	0x20211
+0x294F	0x20485
+0x2950	0x20484
+0x2951	0x20483
+0x2952	0x2048A
+0x2953	0x20486
+0x2954	0x20510
+0x2955	0x20558
+0x2956	0x2055A
+0x2957	0x2070C
+0x2958	0x205C4
+0x2959	0x205C5
+0x295A	0x20647
+0x295B	0x20649
+0x295C	0x2064A
+0x295D	0x2064B
+0x295E	0x221BB
+0x295F	0x2068D
+0x2960	0x2068B
+0x2961	0x20707
+0x2962	0x20706
+0x2963	0x2F820
+0x2964	0x206EF
+0x2965	0x206F0
+0x2966	0x206ED
+0x2967	0x206F9
+0x2968	0x20702
+0x2969	0x206E7
+0x296A	0x206F4
+0x296B	0x206F7
+0x296C	0x206F1
+0x296D	0x20853
+0x296E	0x20855
+0x2970	0x208DA
+0x2971	0x208D9
+0x2973	0x20938
+0x2974	0x20999
+0x2975	0x209A2
+0x2976	0x2099C
+0x2977	0x2099A
+0x2978	0x2099B
+0x2979	0x209E5
+0x297A	0x209E3
+0x297B	0x209E1
+0x297C	0x209E0
+0x297D	0x209E2
+0x297E	0x209E4
+0x2A22	0x209E8
+0x2A23	0x2F82F
+0x2A24	0x20A13
+0x2A25	0x20A56
+0x2A26	0x20A4B
+0x2A27	0x20A4A
+0x2A28	0x20A4D
+0x2A29	0x20A4C
+0x2A2B	0x20AEA
+0x2A2C	0x20AE9
+0x2A2D	0x20AEB
+0x2A2E	0x20AEC
+0x2A2F	0x20B3A
+0x2A30	0x20B3C
+0x2A31	0x20B39
+0x2A32	0x20B3B
+0x2A33	0x20C14
+0x2A34	0x20C0E
+0x2A35	0x20C35
+0x2A36	0x20C0A
+0x2A37	0x20C3F
+0x2A38	0x20C38
+0x2A3A	0x20C4E
+0x2A3B	0x20C17
+0x2A3C	0x2F83F
+0x2A3D	0x20C1E
+0x2A3E	0x211B6
+0x2A3F	0x211CE
+0x2A40	0x211CA
+0x2A41	0x211CB
+0x2A42	0x211CC
+0x2A43	0x211C9
+0x2A44	0x212B4
+0x2A45	0x212AC
+0x2A46	0x21288
+0x2A47	0x21286
+0x2A48	0x2128C
+0x2A49	0x21293
+0x2A4A	0x2128A
+0x2A4B	0x212A4
+0x2A4C	0x21287
+0x2A4D	0x212A5
+0x2A4E	0x212A6
+0x2A4F	0x21285
+0x2A50	0x212A3
+0x2A51	0x2128E
+0x2A52	0x2151F
+0x2A53	0x21563
+0x2A54	0x2158D
+0x2A55	0x215FA
+0x2A56	0x215FB
+0x2A57	0x21609
+0x2A58	0x215FE
+0x2A59	0x215FF
+0x2A5A	0x21602
+0x2A5B	0x21604
+0x2A5C	0x215FD
+0x2A5D	0x21605
+0x2A5E	0x216F9
+0x2A5F	0x216F7
+0x2A60	0x216DB
+0x2A61	0x216DA
+0x2A62	0x21951
+0x2A63	0x21950
+0x2A64	0x21957
+0x2A65	0x219E2
+0x2A66	0x219D8
+0x2A67	0x219DA
+0x2A68	0x219DC
+0x2A69	0x21B20
+0x2A6A	0x21B1F
+0x2A6B	0x21B69
+0x2A6C	0x21BDD
+0x2A6D	0x21C40
+0x2A6E	0x21C41
+0x2A6F	0x21C43
+0x2A70	0x21D0D
+0x2A71	0x21D0C
+0x2A72	0x21D87
+0x2A73	0x21DA9
+0x2A74	0x21D92
+0x2A75	0x21D85
+0x2A77	0x21D8C
+0x2A78	0x21DA2
+0x2A79	0x21D8F
+0x2A7A	0x21D8A
+0x2A7C	0x21D8D
+0x2A7D	0x21FF1
+0x2A7E	0x22037
+0x2B21	0x2208B
+0x2B22	0x22087
+0x2B23	0x22082
+0x2B24	0x2218E
+0x2B25	0x221BC
+0x2B26	0x221F8
+0x2B27	0x221FA
+0x2B28	0x221EB
+0x2B29	0x221F9
+0x2B2A	0x221FC
+0x2B2B	0x22205
+0x2B2C	0x2231B
+0x2B2D	0x2231D
+0x2B2E	0x2231E
+0x2B2F	0x2F892
+0x2B30	0x2233C
+0x2B31	0x2233E
+0x2B32	0x22384
+0x2B33	0x223C8
+0x2B34	0x223C9
+0x2B35	0x223D3
+0x2B36	0x223C7
+0x2B37	0x223D2
+0x2B38	0x22455
+0x2B39	0x2F896
+0x2B3A	0x2248C
+0x2B3B	0x2248A
+0x2B3C	0x224D5
+0x2B3D	0x224D3
+0x2B3F	0x224D8
+0x2B40	0x225D0
+0x2B41	0x225EE
+0x2B42	0x225F1
+0x2B43	0x225FB
+0x2B44	0x225D3
+0x2B45	0x225EC
+0x2B46	0x225CD
+0x2B47	0x22615
+0x2B48	0x22626
+0x2B49	0x2260E
+0x2B4A	0x22627
+0x2B4B	0x2262A
+0x2B4C	0x22600
+0x2B4D	0x22604
+0x2B4E	0x22628
+0x2B4F	0x22608
+0x2B50	0x22614
+0x2B51	0x2299B
+0x2B53	0x229A1
+0x2B54	0x2299D
+0x2B55	0x229A0
+0x2B56	0x2299E
+0x2B57	0x229A2
+0x2B58	0x2299C
+0x2B59	0x22A32
+0x2B5A	0x22A34
+0x2B5B	0x22A93
+0x2B5C	0x22A96
+0x2B5D	0x22A90
+0x2B5E	0x22AB4
+0x2B5F	0x22AB5
+0x2B60	0x2F8B6
+0x2B61	0x22AB6
+0x2B62	0x22AC2
+0x2B63	0x2F8B5
+0x2B64	0x22ABA
+0x2B65	0x22A92
+0x2B66	0x22EFB
+0x2B67	0x22F05
+0x2B68	0x22EF3
+0x2B69	0x22EFE
+0x2B6A	0x22EFD
+0x2B6B	0x2455D
+0x2B6C	0x22EFA
+0x2B6D	0x23043
+0x2B6E	0x23095
+0x2B6F	0x23094
+0x2B71	0x2316F
+0x2B72	0x23173
+0x2B73	0x2315C
+0x2B74	0x2315B
+0x2B75	0x23166
+0x2B76	0x23174
+0x2B77	0x23163
+0x2B78	0x23167
+0x2B79	0x23160
+0x2B7A	0x23162
+0x2B7B	0x23171
+0x2B7C	0x23172
+0x2B7D	0x2315E
+0x2B7E	0x23323
+0x2C21	0x23326
+0x2C22	0x23364
+0x2C23	0x2F8D6
+0x2C24	0x233F2
+0x2C25	0x23401
+0x2C26	0x233DD
+0x2C27	0x233DC
+0x2C28	0x233DB
+0x2C29	0x233F3
+0x2C2A	0x233FD
+0x2C2B	0x233D8
+0x2C2C	0x233F8
+0x2C2D	0x233FB
+0x2C2E	0x23883
+0x2C2F	0x2388C
+0x2C30	0x2388E
+0x2C31	0x23949
+0x2C32	0x23954
+0x2C33	0x23952
+0x2C34	0x2394E
+0x2C35	0x23958
+0x2C36	0x23951
+0x2C37	0x23955
+0x2C38	0x23953
+0x2C39	0x23957
+0x2C3A	0x23950
+0x2C3B	0x2394F
+0x2C3C	0x2394D
+0x2C3D	0x239D2
+0x2C3E	0x239D3
+0x2C3F	0x239C9
+0x2C40	0x239D4
+0x2C41	0x23AEF
+0x2C42	0x2F8F8
+0x2C43	0x200B1
+0x2C44	0x23B05
+0x2C45	0x23B04
+0x2C46	0x23B2E
+0x2C47	0x23B2D
+0x2C48	0x23C45
+0x2C49	0x23C5B
+0x2C4A	0x23C5A
+0x2C4B	0x23C59
+0x2C4C	0x23C9D
+0x2C4D	0x23C8E
+0x2C4E	0x23CBC
+0x2C4F	0x23CDD
+0x2C50	0x23CBA
+0x2C51	0x2F8FD
+0x2C52	0x23CD8
+0x2C53	0x23CCB
+0x2C54	0x23CD9
+0x2C55	0x23CDA
+0x2C56	0x23CC4
+0x2C57	0x23CB8
+0x2C58	0x23CBF
+0x2C59	0x23CDB
+0x2C5A	0x23CC1
+0x2C5B	0x2F8FC
+0x2C5C	0x23CC5
+0x2C5D	0x2F919
+0x2C5E	0x241B1
+0x2C5F	0x241AF
+0x2C60	0x2F918
+0x2C61	0x244F7
+0x2C62	0x244F6
+0x2C63	0x244F8
+0x2C64	0x24550
+0x2C65	0x24551
+0x2C66	0x24571
+0x2C67	0x24570
+0x2C68	0x245B0
+0x2C69	0x245AF
+0x2C6A	0x245AE
+0x2C6B	0x245AD
+0x2C6C	0x24625
+0x2C6D	0x2462C
+0x2C6E	0x24622
+0x2C6F	0x24633
+0x2C70	0x24634
+0x2C72	0x2473A
+0x2C73	0x24740
+0x2C74	0x24768
+0x2C76	0x24764
+0x2C77	0x2475C
+0x2C78	0x24757
+0x2C79	0x24753
+0x2C7A	0x2474F
+0x2C7B	0x24751
+0x2C7C	0x24754
+0x2C7D	0x24766
+0x2D22	0x2490D
+0x2D23	0x24908
+0x2D24	0x2F92B
+0x2D25	0x248FA
+0x2D26	0x24AEA
+0x2D27	0x24B2A
+0x2D28	0x24BBB
+0x2D29	0x24BD5
+0x2D2A	0x24BD7
+0x2D2B	0x21DA4
+0x2D2C	0x200F0
+0x2D2D	0x200B5
+0x2D2E	0x24C06
+0x2D2F	0x24C28
+0x2D30	0x24C22
+0x2D31	0x24C21
+0x2D32	0x22456
+0x2D33	0x24C23
+0x2D34	0x211CD
+0x2D35	0x24D30
+0x2D36	0x24D34
+0x2D37	0x24FC9
+0x2D38	0x24FCA
+0x2D39	0x24FC8
+0x2D3A	0x2F93D
+0x2D3B	0x25044
+0x2D3C	0x250F3
+0x2D3D	0x2F941
+0x2D3E	0x250F8
+0x2D3F	0x250FC
+0x2D40	0x250F6
+0x2D41	0x250FB
+0x2D42	0x250F7
+0x2D43	0x25100
+0x2D44	0x25102
+0x2D45	0x2F940
+0x2D46	0x2F94D
+0x2D47	0x25424
+0x2D48	0x2560D
+0x2D4A	0x25762
+0x2D4B	0x25930
+0x2D4C	0x2592B
+0x2D4D	0x2592A
+0x2D4F	0x2592D
+0x2D50	0x25ADA
+0x2D51	0x25E28
+0x2D52	0x25F86
+0x2D53	0x26277
+0x2D54	0x2627C
+0x2D55	0x26350
+0x2D56	0x2634E
+0x2D57	0x263F2
+0x2D58	0x264B2
+0x2D59	0x264CE
+0x2D5A	0x264CF
+0x2D5B	0x264E5
+0x2D5C	0x23407
+0x2D5D	0x26535
+0x2D5E	0x26531
+0x2D5F	0x26613
+0x2D60	0x2662B
+0x2D61	0x2662C
+0x2D62	0x26645
+0x2D63	0x26660
+0x2D64	0x26641
+0x2D65	0x26658
+0x2D66	0x26647
+0x2D67	0x2665B
+0x2D68	0x26650
+0x2D69	0x2F982
+0x2D6A	0x2665F
+0x2D6B	0x2664A
+0x2D6C	0x26656
+0x2D6D	0x26643
+0x2D6E	0x26644
+0x2D6F	0x26651
+0x2D70	0x268FD
+0x2D71	0x26934
+0x2D72	0x26935
+0x2D73	0x26954
+0x2D74	0x26955
+0x2D75	0x26A0C
+0x2D76	0x26A0B
+0x2D77	0x26A0A
+0x2D78	0x26AF9
+0x2D79	0x26B35
+0x2D7A	0x26B24
+0x2D7B	0x26B13
+0x2D7C	0x26B1C
+0x2D7D	0x26B69
+0x2D7E	0x26B25
+0x2E21	0x26B21
+0x2E22	0x2F995
+0x2E23	0x2F996
+0x2E24	0x2F998
+0x2E25	0x27220
+0x2E26	0x275A9
+0x2E27	0x275A8
+0x2E28	0x275DE
+0x2E29	0x27609
+0x2E2A	0x2760A
+0x2E2B	0x2760B
+0x2E2C	0x277E3
+0x2E2D	0x27807
+0x2E2E	0x278B2
+0x2E2F	0x278B3
+0x2E30	0x2795D
+0x2E31	0x27E58
+0x2E32	0x27E86
+0x2E33	0x27E87
+0x2E34	0x27FB9
+0x2E35	0x27FB8
+0x2E36	0x2840C
+0x2E37	0x28444
+0x2E38	0x28466
+0x2E39	0x28480
+0x2E3A	0x28475
+0x2E3B	0x2846D
+0x2E3C	0x2847E
+0x2E3D	0x28467
+0x2E3E	0x28481
+0x2E3F	0x28477
+0x2E40	0x286A8
+0x2E41	0x286A2
+0x2E42	0x286A5
+0x2E43	0x2869B
+0x2E44	0x28C57
+0x2E45	0x28E0F
+0x2E46	0x28E32
+0x2E47	0x28E2C
+0x2E48	0x28E33
+0x2E49	0x291E7
+0x2E4A	0x2006E
+0x2E4B	0x200B7
+0x2E4C	0x200F6
+0x2E4D	0x200F2
+0x2E4E	0x200F3
+0x2E4F	0x20517
+0x2E50	0x20130
+0x2E51	0x20154
+0x2E52	0x20153
+0x2E53	0x20252
+0x2E54	0x2023D
+0x2E55	0x2023C
+0x2E56	0x20234
+0x2E57	0x20233
+0x2E58	0x20254
+0x2E59	0x2022F
+0x2E5B	0x20255
+0x2E5C	0x2023F
+0x2E5D	0x20237
+0x2E5E	0x20256
+0x2E5F	0x20261
+0x2E60	0x20258
+0x2E61	0x2F806
+0x2E62	0x2023B
+0x2E63	0x20232
+0x2E64	0x2022E
+0x2E65	0x2023E
+0x2E66	0x2003B
+0x2E67	0x2048C
+0x2E68	0x2048D
+0x2E69	0x20513
+0x2E6A	0x20516
+0x2E6B	0x20512
+0x2E6C	0x2055B
+0x2E6D	0x2058A
+0x2E6E	0x205D7
+0x2E6F	0x205CE
+0x2E70	0x20650
+0x2E71	0x20651
+0x2E72	0x2064F
+0x2E73	0x2068E
+0x2E74	0x2068F
+0x2E75	0x206F2
+0x2E76	0x2F821
+0x2E77	0x20728
+0x2E78	0x2071A
+0x2E79	0x20725
+0x2E7A	0x2071D
+0x2E7B	0x20714
+0x2E7C	0x20720
+0x2E7D	0x2071F
+0x2E7E	0x2071B
+0x2F21	0x20717
+0x2F22	0x20715
+0x2F23	0x2071C
+0x2F24	0x20713
+0x2F25	0x2F825
+0x2F26	0x20860
+0x2F28	0x20866
+0x2F29	0x208E3
+0x2F2A	0x208DE
+0x2F2B	0x208E0
+0x2F2C	0x208E1
+0x2F2D	0x2091A
+0x2F2E	0x2091B
+0x2F2F	0x20918
+0x2F30	0x2091C
+0x2F31	0x20919
+0x2F32	0x20942
+0x2F33	0x20940
+0x2F34	0x2093E
+0x2F35	0x20944
+0x2F36	0x20974
+0x2F37	0x20943
+0x2F38	0x2F82D
+0x2F39	0x209F2
+0x2F3A	0x20A1B
+0x2F3B	0x20A19
+0x2F3C	0x20A1E
+0x2F3D	0x2F830
+0x2F3E	0x20A5E
+0x2F3F	0x20A66
+0x2F40	0x20A5D
+0x2F41	0x20A5A
+0x2F42	0x20A5F
+0x2F43	0x20A60
+0x2F44	0x20A5B
+0x2F45	0x20A5C
+0x2F46	0x20A59
+0x2F47	0x20AF0
+0x2F48	0x20AF1
+0x2F49	0x20B43
+0x2F4A	0x20B40
+0x2F4B	0x20B42
+0x2F4C	0x20B41
+0x2F4D	0x20B3F
+0x2F4E	0x20C57
+0x2F4F	0x20C69
+0x2F50	0x20C6F
+0x2F51	0x20CAB
+0x2F52	0x20C71
+0x2F53	0x20C93
+0x2F54	0x20C56
+0x2F55	0x20C90
+0x2F56	0x20C6D
+0x2F57	0x20C6C
+0x2F58	0x20C70
+0x2F59	0x20C66
+0x2F5A	0x20C67
+0x2F5B	0x211D7
+0x2F5C	0x211B5
+0x2F5D	0x211DB
+0x2F5E	0x211D8
+0x2F5F	0x211D5
+0x2F60	0x211D4
+0x2F61	0x212BA
+0x2F62	0x212B7
+0x2F63	0x212BE
+0x2F64	0x212B9
+0x2F66	0x212E0
+0x2F67	0x212DD
+0x2F68	0x212DE
+0x2F69	0x24918
+0x2F6A	0x212D8
+0x2F6B	0x212BD
+0x2F6C	0x212DB
+0x2F6D	0x2151D
+0x2F6E	0x21525
+0x2F6F	0x21721
+0x2F70	0x2170C
+0x2F71	0x21729
+0x2F72	0x2172D
+0x2F73	0x2171B
+0x2F74	0x2170E
+0x2F75	0x2171F
+0x2F76	0x21704
+0x2F77	0x2171C
+0x2F78	0x21705
+0x2F79	0x21706
+0x2F7A	0x21720
+0x2F7B	0x2170D
+0x2F7C	0x2172A
+0x2F7D	0x21723
+0x2F7E	0x21711
+0x3021	0x2195C
+0x3022	0x21966
+0x3023	0x2195B
+0x3024	0x2194F
+0x3025	0x2195E
+0x3026	0x2195D
+0x3027	0x219F1
+0x3028	0x219EA
+0x3029	0x219F4
+0x302A	0x219EB
+0x302B	0x219F0
+0x302C	0x219FA
+0x302D	0x219FB
+0x302E	0x21B28
+0x302F	0x21B2C
+0x3030	0x21B6B
+0x3031	0x21B2A
+0x3032	0x21B6A
+0x3033	0x21B6F
+0x3034	0x21BDB
+0x3035	0x21BE0
+0x3036	0x24FD1
+0x3037	0x21BE3
+0x3038	0x21BE5
+0x3039	0x21BE7
+0x303A	0x21C4D
+0x303B	0x21C55
+0x303C	0x21C54
+0x303D	0x21C53
+0x303E	0x21C52
+0x303F	0x21C4E
+0x3040	0x21C60
+0x3041	0x221C0
+0x3042	0x21D0F
+0x3043	0x21D11
+0x3044	0x21D13
+0x3045	0x21DC6
+0x3046	0x21DB3
+0x3047	0x21DC7
+0x3048	0x21DD2
+0x3049	0x21DB8
+0x304A	0x21DAC
+0x304B	0x21DAE
+0x304C	0x21DCF
+0x304D	0x21DC5
+0x304E	0x2F87B
+0x304F	0x21DCC
+0x3050	0x21DAB
+0x3051	0x21DC9
+0x3052	0x21DB9
+0x3053	0x21FFB
+0x3054	0x21FF8
+0x3055	0x21FF7
+0x3056	0x21FF9
+0x3057	0x22020
+0x3058	0x2203B
+0x3059	0x22039
+0x305A	0x2209E
+0x305B	0x2209A
+0x305C	0x220AA
+0x305D	0x220AB
+0x305E	0x220AF
+0x305F	0x22096
+0x3060	0x220A9
+0x3061	0x220A6
+0x3062	0x22091
+0x3064	0x220AE
+0x3065	0x2209F
+0x3066	0x220AC
+0x3067	0x220A0
+0x3068	0x22192
+0x3069	0x22191
+0x306A	0x221BF
+0x306B	0x22217
+0x306C	0x2220A
+0x306D	0x2220C
+0x306E	0x2234A
+0x306F	0x22346
+0x3070	0x22334
+0x3071	0x22345
+0x3072	0x22343
+0x3073	0x22344
+0x3074	0x2F893
+0x3075	0x22387
+0x3076	0x22386
+0x3077	0x2238A
+0x3078	0x223DA
+0x3079	0x223D8
+0x307B	0x20518
+0x307C	0x20134
+0x307D	0x223D6
+0x307E	0x223D4
+0x3121	0x22454
+0x3122	0x22459
+0x3123	0x2245A
+0x3124	0x22457
+0x3126	0x224DD
+0x3127	0x224E9
+0x3128	0x224E0
+0x3129	0x22605
+0x312A	0x22612
+0x312B	0x22613
+0x312C	0x22607
+0x312D	0x22616
+0x312E	0x22623
+0x312F	0x22602
+0x3130	0x2F8A1
+0x3131	0x2264A
+0x3132	0x22636
+0x3133	0x22640
+0x3134	0x22656
+0x3135	0x22643
+0x3136	0x2F8A0
+0x3137	0x2264B
+0x3138	0x22646
+0x3139	0x2263E
+0x313A	0x22649
+0x313B	0x229A7
+0x313C	0x229B6
+0x313D	0x229A6
+0x313E	0x229A8
+0x313F	0x229AC
+0x3140	0x229A9
+0x3141	0x229AB
+0x3142	0x22A38
+0x3143	0x22A37
+0x3144	0x22A39
+0x3145	0x22A41
+0x3146	0x22A3E
+0x3147	0x22AC0
+0x3148	0x22ABB
+0x3149	0x22ABF
+0x314A	0x22ABD
+0x314B	0x22AFE
+0x314C	0x22B1E
+0x314D	0x22AEE
+0x314E	0x22AFC
+0x314F	0x2F8B7
+0x3150	0x22AF9
+0x3151	0x22B06
+0x3152	0x22AE4
+0x3153	0x22AE9
+0x3154	0x22AE5
+0x3155	0x22B03
+0x3156	0x22AFD
+0x3157	0x22B49
+0x3158	0x22EBE
+0x3159	0x22F0A
+0x315A	0x25626
+0x315B	0x22F18
+0x315C	0x22F0D
+0x315D	0x22F0F
+0x315E	0x22F0E
+0x315F	0x22F20
+0x3160	0x23071
+0x3161	0x23099
+0x3162	0x230E2
+0x3163	0x230DF
+0x3164	0x230DE
+0x3165	0x23178
+0x3166	0x23179
+0x3168	0x2317C
+0x3169	0x2317D
+0x316A	0x23184
+0x316B	0x2318B
+0x316C	0x2318A
+0x316D	0x2F8D2
+0x316E	0x23189
+0x316F	0x2332C
+0x3170	0x23329
+0x3171	0x2336C
+0x3173	0x23409
+0x3174	0x23408
+0x3175	0x2340C
+0x3176	0x2340D
+0x3177	0x23410
+0x3179	0x2389F
+0x317A	0x23898
+0x317B	0x238A2
+0x317C	0x2389A
+0x317D	0x239D5
+0x317E	0x239E2
+0x3221	0x239F0
+0x3222	0x239EA
+0x3223	0x239EB
+0x3224	0x239ED
+0x3225	0x239E8
+0x3226	0x239E0
+0x3227	0x23A85
+0x3228	0x23A86
+0x3229	0x23AF0
+0x322A	0x21E46
+0x322B	0x23B45
+0x322C	0x23B38
+0x322D	0x23B3E
+0x322E	0x23B42
+0x322F	0x23B40
+0x3230	0x23C47
+0x3231	0x23C5C
+0x3232	0x23C5E
+0x3233	0x23CB4
+0x3234	0x23CC2
+0x3235	0x23D14
+0x3236	0x23CE5
+0x3237	0x23D15
+0x3238	0x23D11
+0x3239	0x2F8FF
+0x323A	0x23CEE
+0x323B	0x23CE7
+0x323C	0x23CF5
+0x323D	0x23CF4
+0x323E	0x23CE8
+0x323F	0x23D01
+0x3240	0x23CEF
+0x3241	0x23CF1
+0x3242	0x2F900
+0x3243	0x241DB
+0x3244	0x241BF
+0x3245	0x241DA
+0x3246	0x241C7
+0x3247	0x241DD
+0x3248	0x2F91A
+0x3249	0x241EB
+0x324A	0x241E1
+0x324B	0x241C1
+0x324C	0x241BD
+0x324D	0x24507
+0x324E	0x244FD
+0x324F	0x24501
+0x3250	0x2450A
+0x3251	0x24503
+0x3252	0x24572
+0x3253	0x24574
+0x3254	0x24575
+0x3255	0x245B2
+0x3256	0x245B1
+0x3257	0x245B4
+0x3258	0x2464C
+0x3259	0x24642
+0x325A	0x24640
+0x325B	0x24649
+0x325C	0x2463C
+0x325D	0x2464D
+0x325E	0x2464A
+0x325F	0x2463B
+0x3260	0x24761
+0x3261	0x24774
+0x3262	0x2F926
+0x3263	0x2477F
+0x3264	0x2477A
+0x3265	0x24788
+0x3266	0x2477C
+0x3268	0x24770
+0x3269	0x2490F
+0x326A	0x24928
+0x326B	0x24913
+0x326C	0x2492A
+0x326D	0x24AED
+0x326E	0x24AEF
+0x326F	0x24B2E
+0x3270	0x24BC1
+0x3271	0x24BDD
+0x3272	0x20B47
+0x3273	0x24C2D
+0x3274	0x24C2B
+0x3275	0x24C35
+0x3276	0x24C2F
+0x3277	0x24C31
+0x3278	0x24C34
+0x3279	0x2F935
+0x327A	0x24C30
+0x327B	0x24D3A
+0x327C	0x24D39
+0x327D	0x24D37
+0x327E	0x24D4B
+0x3321	0x24D54
+0x3322	0x24D4D
+0x3323	0x24D51
+0x3324	0x24D47
+0x3325	0x24F27
+0x3326	0x24F50
+0x3327	0x24F4D
+0x3328	0x24F4E
+0x3329	0x24F54
+0x332A	0x24FD2
+0x332B	0x24FCE
+0x332C	0x2504B
+0x332D	0x25049
+0x332E	0x25105
+0x332F	0x2510F
+0x3330	0x25119
+0x3331	0x2F943
+0x3332	0x25106
+0x3333	0x2510C
+0x3334	0x25129
+0x3335	0x25104
+0x3336	0x25108
+0x3337	0x25125
+0x3339	0x25103
+0x333A	0x25127
+0x333B	0x25110
+0x333C	0x2510A
+0x333D	0x2F942
+0x333E	0x26B5D
+0x333F	0x253AA
+0x3340	0x253AB
+0x3341	0x253A9
+0x3342	0x25441
+0x3343	0x2543A
+0x3344	0x2543C
+0x3345	0x2542B
+0x3346	0x25449
+0x3347	0x25615
+0x3349	0x25616
+0x334A	0x2F953
+0x334B	0x25631
+0x334C	0x23C4A
+0x334D	0x2573C
+0x334E	0x2577C
+0x334F	0x2576D
+0x3350	0x2576A
+0x3351	0x25763
+0x3352	0x2576B
+0x3353	0x2577B
+0x3354	0x25764
+0x3355	0x2577A
+0x3356	0x25769
+0x3357	0x2576F
+0x3358	0x25937
+0x3359	0x25935
+0x335A	0x2593C
+0x335B	0x25936
+0x335C	0x2593D
+0x335D	0x2593E
+0x335E	0x25AE1
+0x335F	0x25AE0
+0x3360	0x25E2D
+0x3361	0x25E2B
+0x3362	0x25F8D
+0x3363	0x25F92
+0x3365	0x25F8E
+0x3366	0x2F96B
+0x3367	0x25F91
+0x3368	0x25F96
+0x3369	0x2627B
+0x336A	0x26278
+0x336B	0x26281
+0x336C	0x26296
+0x336D	0x262A3
+0x336E	0x26295
+0x336F	0x26297
+0x3370	0x26354
+0x3371	0x26352
+0x3372	0x263F5
+0x3373	0x26400
+0x3374	0x263FB
+0x3375	0x263F4
+0x3376	0x263F6
+0x3377	0x264E8
+0x3378	0x264EA
+0x3379	0x2663E
+0x337A	0x2663D
+0x337B	0x2663B
+0x337C	0x26680
+0x337E	0x26688
+0x3421	0x26681
+0x3422	0x26682
+0x3423	0x266CE
+0x3424	0x26683
+0x3425	0x26677
+0x3426	0x26679
+0x3427	0x26673
+0x3428	0x2666D
+0x3429	0x26670
+0x342A	0x2668D
+0x342B	0x26675
+0x342C	0x2668C
+0x342D	0x2666A
+0x342E	0x26691
+0x342F	0x26689
+0x3430	0x2668E
+0x3431	0x212DC
+0x3432	0x268FF
+0x3433	0x26959
+0x3434	0x269C7
+0x3435	0x26A12
+0x3436	0x26A14
+0x3437	0x26A13
+0x3438	0x26ACB
+0x3439	0x26B42
+0x343B	0x26B3D
+0x343D	0x26B40
+0x343E	0x26B44
+0x343F	0x26B62
+0x3440	0x26B43
+0x3441	0x26B3F
+0x3442	0x26B45
+0x3443	0x26B3C
+0x3444	0x2F997
+0x3445	0x26B46
+0x3446	0x26B47
+0x3447	0x2F9B3
+0x3448	0x2719E
+0x3449	0x2719D
+0x344A	0x2722C
+0x344B	0x27229
+0x344C	0x2722F
+0x344D	0x2722E
+0x344E	0x27230
+0x344F	0x275E1
+0x3450	0x275E2
+0x3451	0x2760E
+0x3452	0x27619
+0x3453	0x27612
+0x3454	0x278B4
+0x3455	0x27BDA
+0x3456	0x27D26
+0x3457	0x27E59
+0x3458	0x27E5A
+0x3459	0x27E88
+0x345A	0x27FC0
+0x345B	0x27FBA
+0x345C	0x282A0
+0x345D	0x2F9DD
+0x345E	0x282A2
+0x345F	0x28486
+0x3461	0x2849D
+0x3462	0x28488
+0x3463	0x2848F
+0x3464	0x2848E
+0x3465	0x2849B
+0x3466	0x286C1
+0x3467	0x286C3
+0x3468	0x286C4
+0x3469	0x28696
+0x346A	0x286C7
+0x346B	0x286C6
+0x346C	0x286BF
+0x346E	0x2890F
+0x346F	0x28E55
+0x3470	0x28E42
+0x3471	0x28E46
+0x3472	0x28E4B
+0x3473	0x28E43
+0x3474	0x28E53
+0x3475	0x28E48
+0x3476	0x28E49
+0x3477	0x28E4A
+0x3478	0x28E4E
+0x3479	0x24BDE
+0x347A	0x20691
+0x347B	0x2944B
+0x347C	0x29680
+0x347D	0x29681
+0x347E	0x29683
+0x3521	0x2028A
+0x3522	0x29682
+0x3523	0x22342
+0x3524	0x20922
+0x3525	0x20070
+0x3526	0x20071
+0x3527	0x200BC
+0x3528	0x21D18
+0x3529	0x200BE
+0x352A	0x200BA
+0x352B	0x200F8
+0x352C	0x20137
+0x352D	0x20135
+0x352E	0x20AFC
+0x352F	0x20156
+0x3530	0x20159
+0x3531	0x2015E
+0x3532	0x2026D
+0x3533	0x20291
+0x3534	0x20292
+0x3535	0x20268
+0x3536	0x20266
+0x3537	0x20273
+0x3539	0x20296
+0x353A	0x2028B
+0x353B	0x2028C
+0x353C	0x20496
+0x353D	0x204EE
+0x353E	0x2051C
+0x353F	0x2051A
+0x3540	0x20519
+0x3541	0x2051B
+0x3542	0x2055D
+0x3543	0x2055E
+0x3544	0x2F818
+0x3545	0x205DC
+0x3546	0x205E2
+0x3547	0x20652
+0x3548	0x20692
+0x3549	0x20730
+0x354A	0x20752
+0x354B	0x20742
+0x354C	0x20741
+0x354D	0x20745
+0x354E	0x20737
+0x354F	0x20740
+0x3550	0x2073F
+0x3551	0x2073D
+0x3552	0x20738
+0x3553	0x2073A
+0x3554	0x20749
+0x3555	0x2086B
+0x3556	0x20878
+0x3557	0x20879
+0x3558	0x2F826
+0x3559	0x2086C
+0x355A	0x208E9
+0x355B	0x208E6
+0x355C	0x208E5
+0x355D	0x208EA
+0x355E	0x208E7
+0x355F	0x208E8
+0x3560	0x2091F
+0x3561	0x2094B
+0x3562	0x2094A
+0x3563	0x20953
+0x3564	0x20976
+0x3565	0x209A3
+0x3566	0x209A4
+0x3567	0x209F6
+0x3568	0x209F3
+0x3569	0x209F9
+0x356A	0x209F7
+0x356B	0x209FC
+0x356C	0x20A1D
+0x356D	0x20A6D
+0x356E	0x20A71
+0x356F	0x20A6C
+0x3570	0x20A6E
+0x3571	0x20A70
+0x3572	0x20A6F
+0x3573	0x20A67
+0x3574	0x20A68
+0x3575	0x20AFA
+0x3576	0x20AF9
+0x3577	0x20B4E
+0x3579	0x20B4D
+0x357A	0x20B4F
+0x357B	0x20B4A
+0x357C	0x20B4C
+0x357E	0x2F842
+0x3621	0x20CEE
+0x3622	0x20CB2
+0x3623	0x20CC0
+0x3624	0x20CC1
+0x3625	0x20CF4
+0x3626	0x20CC8
+0x3627	0x20CC5
+0x3628	0x20CC6
+0x3629	0x20CAD
+0x362A	0x211E2
+0x362B	0x211EA
+0x362C	0x211E3
+0x362D	0x211E1
+0x362E	0x212F7
+0x362F	0x21301
+0x3630	0x21312
+0x3631	0x212F6
+0x3632	0x212F1
+0x3633	0x2131F
+0x3634	0x212EE
+0x3635	0x2F852
+0x3636	0x212F3
+0x3637	0x21315
+0x3638	0x21316
+0x3639	0x21317
+0x363A	0x212F8
+0x363B	0x21319
+0x363C	0x212F2
+0x363D	0x212F4
+0x363E	0x212F5
+0x363F	0x21313
+0x3640	0x21306
+0x3641	0x21526
+0x3642	0x21524
+0x3643	0x2155A
+0x3644	0x22EC8
+0x3645	0x21597
+0x3646	0x21595
+0x3647	0x2159A
+0x3648	0x2161F
+0x3649	0x20AFB
+0x364A	0x21629
+0x364B	0x21620
+0x364C	0x2F862
+0x364D	0x2F863
+0x364E	0x2174C
+0x364F	0x21730
+0x3650	0x21738
+0x3651	0x2173D
+0x3652	0x21751
+0x3653	0x2174F
+0x3654	0x2174A
+0x3655	0x21734
+0x3656	0x21736
+0x3658	0x2196A
+0x3659	0x21968
+0x365A	0x21A1C
+0x365B	0x21A0E
+0x365C	0x21A1E
+0x365E	0x21A09
+0x365F	0x21A08
+0x3660	0x21A13
+0x3661	0x21A01
+0x3662	0x21A0F
+0x3663	0x21A14
+0x3664	0x21A06
+0x3665	0x21A07
+0x3667	0x2F873
+0x3669	0x21B79
+0x366A	0x21BEA
+0x366B	0x21BED
+0x366C	0x21BE9
+0x366D	0x21BEE
+0x366E	0x21C68
+0x366F	0x21C64
+0x3670	0x21C67
+0x3671	0x21C72
+0x3672	0x21C62
+0x3673	0x21C74
+0x3674	0x21C79
+0x3675	0x21D19
+0x3676	0x21D17
+0x3677	0x21D15
+0x3678	0x21D16
+0x3679	0x21DE6
+0x367A	0x262A4
+0x367B	0x21DEE
+0x367D	0x21DDF
+0x367E	0x21DE4
+0x3721	0x21DDA
+0x3722	0x21DEA
+0x3723	0x21DED
+0x3724	0x21DE3
+0x3725	0x21DE9
+0x3726	0x21FFD
+0x3727	0x20657
+0x3728	0x22021
+0x3729	0x220C6
+0x372A	0x220B8
+0x372B	0x220CB
+0x372C	0x2F885
+0x372D	0x220BD
+0x372E	0x220B5
+0x372F	0x220BB
+0x3730	0x220BF
+0x3731	0x220BE
+0x3732	0x220B2
+0x3733	0x220C1
+0x3734	0x220C2
+0x3735	0x22199
+0x3736	0x221C6
+0x3737	0x2222C
+0x3738	0x2222D
+0x3739	0x22225
+0x373A	0x2221E
+0x373B	0x2221F
+0x373C	0x22223
+0x373D	0x22350
+0x373E	0x2234E
+0x373F	0x2234D
+0x3740	0x22352
+0x3741	0x223E9
+0x3742	0x223EC
+0x3743	0x223E8
+0x3744	0x22458
+0x3745	0x2245C
+0x3746	0x2245B
+0x3747	0x2248F
+0x3748	0x23972
+0x3749	0x224F6
+0x374A	0x22500
+0x374B	0x224FC
+0x374C	0x224F8
+0x374D	0x224EA
+0x374E	0x224FE
+0x374F	0x224F7
+0x3750	0x224FD
+0x3751	0x22670
+0x3752	0x22662
+0x3753	0x22644
+0x3755	0x2264D
+0x3756	0x2264C
+0x3757	0x2263F
+0x3758	0x22666
+0x3759	0x22635
+0x375B	0x22634
+0x375C	0x2268D
+0x375D	0x22684
+0x375F	0x22686
+0x3760	0x22689
+0x3761	0x22687
+0x3762	0x22683
+0x3763	0x22675
+0x3764	0x22679
+0x3765	0x226AF
+0x3766	0x226B0
+0x3767	0x229B7
+0x3768	0x229BB
+0x3769	0x229B9
+0x376A	0x22A46
+0x376B	0x22A47
+0x376C	0x22A45
+0x376D	0x22AEA
+0x376E	0x22AF6
+0x376F	0x22B68
+0x3770	0x22B39
+0x3771	0x2F8B9
+0x3772	0x22B3D
+0x3773	0x22B3B
+0x3774	0x22B4D
+0x3775	0x22B30
+0x3776	0x22B4A
+0x3777	0x22B3E
+0x3778	0x22B40
+0x3779	0x22B4C
+0x377A	0x22B47
+0x377B	0x22B38
+0x377C	0x22B52
+0x377D	0x22B3A
+0x377E	0x22B53
+0x3821	0x22EC4
+0x3822	0x22EC1
+0x3823	0x22F1C
+0x3824	0x22F1D
+0x3825	0x22F2A
+0x3826	0x22F1E
+0x3827	0x22F2F
+0x3828	0x22F22
+0x3829	0x22F2E
+0x382A	0x22F25
+0x382D	0x2304A
+0x382E	0x2304B
+0x382F	0x23076
+0x3831	0x230E8
+0x3832	0x230EF
+0x3833	0x230E9
+0x3835	0x230EA
+0x3836	0x2F8CC
+0x3838	0x2319B
+0x3839	0x2319E
+0x383A	0x23193
+0x383B	0x231A7
+0x383C	0x2319C
+0x383D	0x231A0
+0x383E	0x2319A
+0x383F	0x231AB
+0x3840	0x231BE
+0x3841	0x231A9
+0x3842	0x2332D
+0x3843	0x2336E
+0x3844	0x23444
+0x3845	0x2343D
+0x3846	0x2343A
+0x3847	0x23468
+0x3848	0x2343C
+0x3849	0x2346A
+0x384A	0x2F8E0
+0x384B	0x23438
+0x384C	0x23465
+0x384D	0x23439
+0x384E	0x2346D
+0x384F	0x23436
+0x3850	0x2F8E3
+0x3851	0x2343E
+0x3852	0x2347E
+0x3853	0x23437
+0x3854	0x23899
+0x3855	0x238A9
+0x3856	0x238AD
+0x3857	0x238A7
+0x3858	0x238A8
+0x3859	0x23966
+0x385A	0x23969
+0x385B	0x2396D
+0x385C	0x23967
+0x385D	0x2396B
+0x385E	0x2396A
+0x385F	0x239EE
+0x3860	0x23A01
+0x3861	0x23A03
+0x3862	0x239F4
+0x3863	0x239FB
+0x3865	0x239F6
+0x3866	0x239FC
+0x3867	0x23AF4
+0x3868	0x23B08
+0x3869	0x23B0A
+0x386A	0x23B09
+0x386B	0x23B6D
+0x386C	0x23B62
+0x386D	0x23B41
+0x386E	0x23B5E
+0x386F	0x23B5C
+0x3870	0x23CF3
+0x3871	0x23D26
+0x3873	0x23D39
+0x3874	0x2F904
+0x3875	0x23D6C
+0x3876	0x23D2B
+0x3877	0x23D2E
+0x3878	0x23D3B
+0x3879	0x23D5E
+0x387A	0x23DFB
+0x387B	0x23D27
+0x387C	0x23D24
+0x387D	0x23D69
+0x387E	0x23D30
+0x3921	0x2F905
+0x3922	0x23D62
+0x3923	0x23D38
+0x3924	0x23D35
+0x3925	0x23D2A
+0x3926	0x23D2C
+0x3927	0x23D68
+0x3928	0x23D31
+0x3929	0x23D2F
+0x392A	0x23D2D
+0x392B	0x23D3A
+0x392C	0x23D36
+0x392D	0x2F903
+0x392E	0x23D21
+0x392F	0x23D3C
+0x3930	0x23D20
+0x3931	0x23D64
+0x3932	0x23D3E
+0x3934	0x241F7
+0x3935	0x24212
+0x3936	0x241F1
+0x3937	0x241F5
+0x3938	0x24222
+0x3939	0x241F2
+0x393A	0x241DF
+0x393B	0x24215
+0x393C	0x24216
+0x393D	0x2457A
+0x393E	0x24576
+0x393F	0x245BE
+0x3941	0x245BD
+0x3942	0x24609
+0x3943	0x24608
+0x3944	0x24657
+0x3945	0x247A3
+0x3946	0x247BF
+0x3947	0x247B8
+0x3948	0x247AF
+0x3949	0x2479C
+0x394A	0x247A5
+0x394B	0x24772
+0x394C	0x24775
+0x394D	0x2479D
+0x394E	0x24799
+0x394F	0x247B9
+0x3950	0x2494E
+0x3951	0x24939
+0x3952	0x2493B
+0x3953	0x24935
+0x3954	0x2493C
+0x3955	0x24955
+0x3956	0x24AF0
+0x3957	0x24AF3
+0x3958	0x24AF4
+0x3959	0x24B3B
+0x395A	0x24B3C
+0x395B	0x24B3A
+0x395C	0x24B36
+0x395D	0x24C07
+0x395E	0x20CEB
+0x395F	0x24C55
+0x3960	0x24C50
+0x3961	0x24C4F
+0x3962	0x24C52
+0x3963	0x24C56
+0x3964	0x200BD
+0x3965	0x24C32
+0x3966	0x24D63
+0x3967	0x24D6B
+0x3968	0x24D66
+0x3969	0x24D57
+0x396A	0x24D5D
+0x396C	0x24D6D
+0x396D	0x24D61
+0x396E	0x24D69
+0x396F	0x24D5A
+0x3970	0x24D5C
+0x3971	0x24D62
+0x3972	0x24F2A
+0x3973	0x24F29
+0x3974	0x24F58
+0x3975	0x24F5A
+0x3976	0x24FD7
+0x3977	0x24FDB
+0x3978	0x24FDC
+0x3979	0x24FDD
+0x397A	0x24FD8
+0x397B	0x25054
+0x397C	0x2505B
+0x397D	0x2505C
+0x397E	0x25053
+0x3A21	0x2504F
+0x3A22	0x25056
+0x3A23	0x25050
+0x3A24	0x2505A
+0x3A25	0x2506B
+0x3A26	0x25136
+0x3A27	0x25153
+0x3A28	0x2513A
+0x3A29	0x2513C
+0x3A2A	0x2513E
+0x3A2B	0x25149
+0x3A2C	0x25140
+0x3A2D	0x2F946
+0x3A2E	0x2F947
+0x3A2F	0x25364
+0x3A30	0x25365
+0x3A31	0x253B5
+0x3A32	0x253B6
+0x3A33	0x253B2
+0x3A34	0x25448
+0x3A35	0x2544A
+0x3A36	0x25472
+0x3A37	0x25469
+0x3A38	0x2545A
+0x3A39	0x2544C
+0x3A3A	0x2562C
+0x3A3B	0x25630
+0x3A3C	0x2564B
+0x3A3D	0x25649
+0x3A3E	0x25642
+0x3A3F	0x25644
+0x3A40	0x2564A
+0x3A41	0x2564F
+0x3A42	0x25792
+0x3A43	0x2F957
+0x3A44	0x25797
+0x3A45	0x25780
+0x3A46	0x25782
+0x3A47	0x25786
+0x3A48	0x25953
+0x3A49	0x2595E
+0x3A4A	0x25952
+0x3A4B	0x2595B
+0x3A4C	0x2594E
+0x3A4D	0x25A6D
+0x3A4E	0x25A6E
+0x3A4F	0x25AFA
+0x3A50	0x25AF6
+0x3A51	0x25AFB
+0x3A52	0x25E33
+0x3A53	0x25E3D
+0x3A54	0x25E37
+0x3A55	0x25E3E
+0x3A56	0x25E35
+0x3A57	0x25F9A
+0x3A58	0x25FAB
+0x3A59	0x25FA6
+0x3A5A	0x25FB0
+0x3A5B	0x25F99
+0x3A5C	0x25FA0
+0x3A5D	0x25F9E
+0x3A5E	0x25FA8
+0x3A5F	0x25FA1
+0x3A60	0x25FAA
+0x3A61	0x25FAD
+0x3A62	0x25FBB
+0x3A63	0x25F9C
+0x3A64	0x25FA5
+0x3A65	0x200B3
+0x3A66	0x26227
+0x3A67	0x2628D
+0x3A68	0x2628E
+0x3A69	0x2628F
+0x3A6A	0x26292
+0x3A6C	0x26291
+0x3A6D	0x262AD
+0x3A6E	0x26357
+0x3A6F	0x26358
+0x3A70	0x2635E
+0x3A71	0x2635D
+0x3A72	0x2635C
+0x3A73	0x2635B
+0x3A75	0x2640A
+0x3A76	0x26403
+0x3A77	0x2640E
+0x3A78	0x264B8
+0x3A79	0x2654D
+0x3A7A	0x2653F
+0x3A7B	0x26547
+0x3A7C	0x2654B
+0x3A7D	0x2654A
+0x3A7E	0x2653D
+0x3B22	0x26541
+0x3B23	0x2654C
+0x3B25	0x26662
+0x3B26	0x26669
+0x3B27	0x26661
+0x3B29	0x266AA
+0x3B2A	0x266A6
+0x3B2B	0x266AC
+0x3B2C	0x266BD
+0x3B2D	0x266BB
+0x3B2E	0x266A4
+0x3B2F	0x266BA
+0x3B30	0x2669A
+0x3B32	0x266A1
+0x3B33	0x266C1
+0x3B34	0x268E0
+0x3B35	0x2690A
+0x3B36	0x26903
+0x3B37	0x26906
+0x3B38	0x26939
+0x3B39	0x2693A
+0x3B3A	0x26936
+0x3B3B	0x2695B
+0x3B3C	0x2695F
+0x3B3D	0x2695E
+0x3B3E	0x26967
+0x3B3F	0x26961
+0x3B40	0x26962
+0x3B41	0x2695D
+0x3B42	0x269CA
+0x3B43	0x269CC
+0x3B44	0x269CE
+0x3B45	0x26A18
+0x3B46	0x26A1D
+0x3B47	0x26A1F
+0x3B48	0x26A20
+0x3B49	0x26A17
+0x3B4A	0x26A15
+0x3B4B	0x26B1F
+0x3B4C	0x26B27
+0x3B4D	0x26B26
+0x3B4E	0x21E10
+0x3B4F	0x26B8B
+0x3B50	0x26BAE
+0x3B51	0x26B8A
+0x3B52	0x2F999
+0x3B53	0x26B92
+0x3B54	0x26B89
+0x3B55	0x26B87
+0x3B57	0x26B8F
+0x3B58	0x26B84
+0x3B59	0x26B83
+0x3B5A	0x26B8C
+0x3B5B	0x26B93
+0x3B5C	0x26B8D
+0x3B5D	0x26B98
+0x3B5E	0x26B7D
+0x3B5F	0x26B7E
+0x3B60	0x26BD2
+0x3B61	0x26B80
+0x3B62	0x26B99
+0x3B63	0x271AC
+0x3B64	0x27250
+0x3B65	0x27255
+0x3B66	0x27242
+0x3B67	0x2723F
+0x3B68	0x2723C
+0x3B6A	0x2724C
+0x3B6B	0x27249
+0x3B6C	0x27257
+0x3B6D	0x27258
+0x3B6E	0x2724F
+0x3B6F	0x2725C
+0x3B70	0x27247
+0x3B71	0x2F9B7
+0x3B72	0x275AB
+0x3B74	0x275AF
+0x3B75	0x275AD
+0x3B76	0x275E8
+0x3B77	0x275E7
+0x3B78	0x27630
+0x3B79	0x27626
+0x3B7A	0x2762F
+0x3B7B	0x27628
+0x3B7C	0x2762B
+0x3B7D	0x2761D
+0x3B7E	0x2762D
+0x3C21	0x27620
+0x3C22	0x2762A
+0x3C23	0x2762C
+0x3C24	0x27635
+0x3C25	0x27621
+0x3C26	0x27623
+0x3C27	0x27624
+0x3C28	0x27636
+0x3C29	0x27637
+0x3C2A	0x277E9
+0x3C2B	0x278BA
+0x3C2C	0x278B8
+0x3C2D	0x2F9CC
+0x3C2E	0x2796D
+0x3C2F	0x2796A
+0x3C30	0x27968
+0x3C31	0x27969
+0x3C32	0x2796B
+0x3C33	0x27961
+0x3C34	0x27BDC
+0x3C35	0x27BDB
+0x3C36	0x27C2D
+0x3C37	0x27C2C
+0x3C38	0x27CA2
+0x3C39	0x27D2B
+0x3C3A	0x27D32
+0x3C3B	0x2F9D7
+0x3C3C	0x27E94
+0x3C3D	0x27E92
+0x3C3E	0x27E90
+0x3C3F	0x27FC9
+0x3C40	0x27FC4
+0x3C41	0x27FC1
+0x3C42	0x27FC3
+0x3C43	0x27FCD
+0x3C44	0x28214
+0x3C45	0x282A7
+0x3C46	0x282AF
+0x3C47	0x282AA
+0x3C48	0x2840D
+0x3C49	0x28454
+0x3C4A	0x2845B
+0x3C4B	0x28461
+0x3C4C	0x284AE
+0x3C4D	0x284B3
+0x3C4E	0x284C0
+0x3C4F	0x284C4
+0x3C50	0x284BF
+0x3C51	0x284CB
+0x3C52	0x284AD
+0x3C53	0x284A7
+0x3C54	0x284A4
+0x3C55	0x284BD
+0x3C56	0x284AF
+0x3C57	0x284B2
+0x3C58	0x284A5
+0x3C59	0x286E7
+0x3C5A	0x286E0
+0x3C5B	0x286CE
+0x3C5C	0x286DE
+0x3C5D	0x286D5
+0x3C5E	0x286DF
+0x3C5F	0x286D9
+0x3C60	0x287F2
+0x3C61	0x28923
+0x3C62	0x28940
+0x3C64	0x2893E
+0x3C66	0x28CCF
+0x3C67	0x20B54
+0x3C68	0x28E5B
+0x3C69	0x28E58
+0x3C6A	0x28E62
+0x3C6B	0x28E5F
+0x3C6C	0x28E67
+0x3C6D	0x28E63
+0x3C6E	0x28E5E
+0x3C6F	0x28E60
+0x3C70	0x28F85
+0x3C71	0x28F86
+0x3C72	0x28F87
+0x3C73	0x291E8
+0x3C74	0x291E6
+0x3C75	0x29671
+0x3C76	0x29685
+0x3C77	0x2FA02
+0x3C78	0x29686
+0x3C79	0x29810
+0x3C7A	0x209F8
+0x3C7B	0x200BF
+0x3C7C	0x20B61
+0x3C7D	0x200FE
+0x3C7E	0x200FC
+0x3D21	0x20139
+0x3D22	0x20161
+0x3D23	0x20160
+0x3D24	0x202E2
+0x3D25	0x202EA
+0x3D26	0x202E3
+0x3D27	0x202B4
+0x3D28	0x202AE
+0x3D29	0x202BE
+0x3D2A	0x202B8
+0x3D2B	0x202A8
+0x3D2C	0x202AA
+0x3D2D	0x202A9
+0x3D2E	0x202B3
+0x3D2F	0x202D5
+0x3D30	0x202AD
+0x3D31	0x202B9
+0x3D32	0x202BB
+0x3D33	0x202B1
+0x3D34	0x202C2
+0x3D35	0x2F808
+0x3D36	0x202EB
+0x3D37	0x202BA
+0x3D38	0x202D2
+0x3D39	0x202D4
+0x3D3A	0x204F1
+0x3D3B	0x2051D
+0x3D3C	0x2F812
+0x3D3D	0x20562
+0x3D3E	0x2058C
+0x3D3F	0x205E6
+0x3D40	0x205E7
+0x3D41	0x2065A
+0x3D42	0x20658
+0x3D43	0x20659
+0x3D44	0x20696
+0x3D45	0x20697
+0x3D46	0x20761
+0x3D47	0x20767
+0x3D48	0x20771
+0x3D49	0x20765
+0x3D4A	0x2077D
+0x3D4B	0x2077E
+0x3D4C	0x2087D
+0x3D4D	0x20884
+0x3D4E	0x2087C
+0x3D4F	0x2087E
+0x3D50	0x2087F
+0x3D51	0x20880
+0x3D52	0x208EF
+0x3D53	0x208F4
+0x3D54	0x2091E
+0x3D55	0x2094E
+0x3D56	0x209FB
+0x3D57	0x209FA
+0x3D58	0x209FD
+0x3D59	0x2F831
+0x3D5A	0x2F832
+0x3D5B	0x20A79
+0x3D5C	0x20A7C
+0x3D5D	0x20A7D
+0x3D5E	0x20A84
+0x3D5F	0x20A7B
+0x3D60	0x20A78
+0x3D62	0x20B5E
+0x3D63	0x20B5A
+0x3D64	0x20B5C
+0x3D65	0x20B59
+0x3D66	0x20B55
+0x3D67	0x20B63
+0x3D68	0x20B56
+0x3D69	0x20B5F
+0x3D6A	0x20B60
+0x3D6B	0x20B5B
+0x3D6C	0x20D4A
+0x3D6D	0x20D65
+0x3D6E	0x20DB3
+0x3D6F	0x20D2C
+0x3D70	0x20D77
+0x3D71	0x20D3D
+0x3D72	0x20D52
+0x3D73	0x20D61
+0x3D74	0x20D2A
+0x3D75	0x20D3E
+0x3D76	0x20D34
+0x3D77	0x20D29
+0x3D78	0x20DB2
+0x3D79	0x20DAD
+0x3D7A	0x20D40
+0x3D7B	0x20D53
+0x3D7C	0x2F844
+0x3D7D	0x20D3F
+0x3D7E	0x20D41
+0x3E21	0x20D72
+0x3E22	0x211F6
+0x3E23	0x211F5
+0x3E24	0x211F4
+0x3E25	0x211F2
+0x3E26	0x211F9
+0x3E27	0x21327
+0x3E28	0x21354
+0x3E29	0x21355
+0x3E2A	0x2132E
+0x3E2B	0x2F854
+0x3E2C	0x2F853
+0x3E2D	0x2132C
+0x3E2E	0x21338
+0x3E2F	0x21339
+0x3E30	0x21331
+0x3E31	0x2134F
+0x3E32	0x21373
+0x3E33	0x21330
+0x3E34	0x2132B
+0x3E35	0x21351
+0x3E36	0x2152C
+0x3E37	0x2155B
+0x3E38	0x2155C
+0x3E39	0x21568
+0x3E3A	0x2156C
+0x3E3B	0x2156B
+0x3E3C	0x21569
+0x3E3D	0x2159F
+0x3E3E	0x21638
+0x3E3F	0x2163C
+0x3E40	0x2163A
+0x3E41	0x21635
+0x3E43	0x21639
+0x3E44	0x21636
+0x3E45	0x2163B
+0x3E46	0x21760
+0x3E47	0x21761
+0x3E48	0x21763
+0x3E49	0x21764
+0x3E4A	0x21794
+0x3E4B	0x21793
+0x3E4C	0x2175E
+0x3E4D	0x21768
+0x3E4E	0x2176A
+0x3E4F	0x21765
+0x3E50	0x2F866
+0x3E51	0x21790
+0x3E52	0x2175F
+0x3E53	0x21772
+0x3E54	0x2F865
+0x3E55	0x21A3C
+0x3E56	0x21A27
+0x3E57	0x21A24
+0x3E58	0x21A26
+0x3E59	0x21A25
+0x3E5B	0x21A28
+0x3E5C	0x21A36
+0x3E5D	0x21B31
+0x3E5E	0x21B30
+0x3E5F	0x21B34
+0x3E60	0x21B81
+0x3E61	0x21B7D
+0x3E62	0x21B82
+0x3E63	0x21B80
+0x3E65	0x202D3
+0x3E66	0x21BF2
+0x3E67	0x21C66
+0x3E68	0x21C8C
+0x3E69	0x21C7B
+0x3E6A	0x21C83
+0x3E6C	0x21C8E
+0x3E6D	0x21C7A
+0x3E6E	0x21C92
+0x3E6F	0x21C91
+0x3E70	0x21C82
+0x3E71	0x21D1B
+0x3E72	0x21D1C
+0x3E73	0x21E27
+0x3E74	0x21E21
+0x3E77	0x21E43
+0x3E79	0x21E18
+0x3E7A	0x21E7B
+0x3E7B	0x21E1A
+0x3E7C	0x21E4B
+0x3E7D	0x21E4A
+0x3E7E	0x21E4D
+0x3F21	0x21E4F
+0x3F22	0x21E19
+0x3F23	0x21E35
+0x3F24	0x21E13
+0x3F25	0x21E52
+0x3F26	0x21E14
+0x3F27	0x21E1E
+0x3F28	0x21E2C
+0x3F29	0x21E20
+0x3F2A	0x21E22
+0x3F2B	0x21E12
+0x3F2C	0x21E1F
+0x3F2D	0x22000
+0x3F2E	0x22023
+0x3F2F	0x22040
+0x3F30	0x22043
+0x3F31	0x220E4
+0x3F32	0x220DB
+0x3F33	0x220EA
+0x3F34	0x220DD
+0x3F35	0x220CC
+0x3F36	0x220D9
+0x3F37	0x220E8
+0x3F38	0x220F6
+0x3F39	0x220E3
+0x3F3A	0x220D3
+0x3F3B	0x220DA
+0x3F3C	0x220D6
+0x3F3D	0x220E7
+0x3F3E	0x2223A
+0x3F3F	0x2223F
+0x3F40	0x22240
+0x3F41	0x22248
+0x3F42	0x22259
+0x3F43	0x22237
+0x3F44	0x22244
+0x3F45	0x2F88C
+0x3F46	0x2F88B
+0x3F47	0x22255
+0x3F48	0x22239
+0x3F49	0x22354
+0x3F4A	0x22355
+0x3F4B	0x22356
+0x3F4C	0x22357
+0x3F4D	0x22358
+0x3F4E	0x22359
+0x3F4F	0x2238D
+0x3F50	0x223F2
+0x3F51	0x223F8
+0x3F52	0x223F5
+0x3F53	0x223F6
+0x3F54	0x223FC
+0x3F55	0x223FE
+0x3F56	0x223F1
+0x3F57	0x223FD
+0x3F58	0x2245E
+0x3F59	0x22496
+0x3F5A	0x22497
+0x3F5B	0x2249C
+0x3F5C	0x2249B
+0x3F5D	0x22495
+0x3F5E	0x2F89A
+0x3F5F	0x2251A
+0x3F60	0x22509
+0x3F61	0x22504
+0x3F62	0x2250E
+0x3F63	0x2251C
+0x3F64	0x22518
+0x3F65	0x2250D
+0x3F66	0x22510
+0x3F67	0x2250C
+0x3F68	0x22503
+0x3F69	0x2267B
+0x3F6A	0x226A6
+0x3F6B	0x22677
+0x3F6C	0x22688
+0x3F6D	0x22674
+0x3F6E	0x226DA
+0x3F6F	0x22676
+0x3F70	0x22678
+0x3F71	0x2268A
+0x3F72	0x2268F
+0x3F73	0x2267D
+0x3F74	0x22690
+0x3F75	0x226ED
+0x3F76	0x226D9
+0x3F77	0x226D0
+0x3F78	0x2271A
+0x3F79	0x226D7
+0x3F7A	0x226E2
+0x3F7B	0x226E1
+0x3F7C	0x226C5
+0x3F7D	0x226E0
+0x3F7E	0x226CA
+0x4021	0x22725
+0x4022	0x226CC
+0x4023	0x2F8B3
+0x4024	0x229C6
+0x4025	0x229C1
+0x4026	0x22A4D
+0x4027	0x22B4B
+0x4028	0x22B64
+0x4029	0x22B95
+0x402A	0x22B99
+0x402B	0x2F8BC
+0x402C	0x22B94
+0x402D	0x22BA2
+0x402E	0x22BAE
+0x402F	0x22B9E
+0x4030	0x22BA7
+0x4031	0x22B86
+0x4033	0x22BA4
+0x4034	0x22B91
+0x4035	0x22B93
+0x4036	0x2F8BB
+0x4037	0x22B88
+0x4038	0x22ECD
+0x4039	0x22ECA
+0x403A	0x22F3F
+0x403B	0x22F40
+0x403C	0x22F46
+0x403D	0x22F41
+0x403E	0x22F45
+0x403F	0x22F58
+0x4040	0x22F3B
+0x4041	0x22F48
+0x4042	0x2304E
+0x4043	0x23052
+0x4044	0x2304F
+0x4045	0x2307B
+0x4046	0x2307A
+0x4047	0x230A0
+0x4048	0x2309F
+0x4049	0x230FB
+0x404A	0x230F7
+0x404B	0x231B8
+0x404C	0x231B9
+0x404D	0x231BB
+0x404E	0x231B7
+0x4050	0x231BA
+0x4052	0x231DA
+0x4053	0x231B5
+0x4054	0x231BF
+0x4055	0x231BC
+0x4056	0x231C0
+0x4057	0x2F8D3
+0x4058	0x2F8D9
+0x4059	0x23375
+0x405A	0x23379
+0x405B	0x23376
+0x405C	0x23435
+0x405D	0x23440
+0x405E	0x234C0
+0x405F	0x23481
+0x4060	0x234AD
+0x4061	0x234AF
+0x4062	0x234AC
+0x4063	0x2348F
+0x4064	0x234A8
+0x4065	0x234AA
+0x4066	0x234A9
+0x4067	0x23488
+0x4068	0x2347F
+0x4069	0x23480
+0x406A	0x234BC
+0x406B	0x238AE
+0x406C	0x238BB
+0x406D	0x238BD
+0x406F	0x23978
+0x4070	0x23974
+0x4071	0x23A0C
+0x4072	0x23A11
+0x4073	0x23A08
+0x4074	0x23A06
+0x4075	0x23A10
+0x4076	0x23A8F
+0x4077	0x23A90
+0x4078	0x23A8D
+0x4079	0x23A8E
+0x407A	0x23A96
+0x407B	0x23A95
+0x407C	0x23B0B
+0x407D	0x23B0C
+0x407E	0x23B7C
+0x4121	0x23B73
+0x4122	0x23B75
+0x4123	0x23B76
+0x4124	0x23B7D
+0x4125	0x23B78
+0x4126	0x23B71
+0x4127	0x23C4B
+0x4128	0x23C4E
+0x4129	0x23D33
+0x412A	0x23D32
+0x412C	0x23D91
+0x412D	0x23DE7
+0x412E	0x23DE9
+0x412F	0x23DA2
+0x4130	0x23D94
+0x4131	0x23D87
+0x4132	0x23DA3
+0x4133	0x23DDD
+0x4134	0x23D7B
+0x4135	0x23D83
+0x4136	0x23D81
+0x4137	0x23DDF
+0x4138	0x23D7C
+0x4139	0x23DE4
+0x413A	0x23DE2
+0x413B	0x23D93
+0x413C	0x23D7D
+0x413D	0x23DBF
+0x413E	0x23D9B
+0x413F	0x23D8E
+0x4140	0x23D9F
+0x4142	0x23D8C
+0x4143	0x23D7F
+0x4144	0x23D9C
+0x4145	0x23D84
+0x4146	0x23D42
+0x4147	0x23DE6
+0x4148	0x24251
+0x4149	0x2424A
+0x414A	0x24264
+0x414B	0x24225
+0x414C	0x2422F
+0x414D	0x2422E
+0x414E	0x2422B
+0x414F	0x24228
+0x4150	0x24232
+0x4151	0x2422D
+0x4152	0x24231
+0x4153	0x24239
+0x4154	0x2422C
+0x4155	0x24261
+0x4156	0x24511
+0x4157	0x24510
+0x4158	0x24512
+0x4159	0x24553
+0x415A	0x24555
+0x415B	0x2457B
+0x415C	0x24581
+0x415D	0x2457D
+0x415E	0x2457C
+0x415F	0x245C2
+0x4160	0x245C5
+0x4161	0x2F922
+0x4162	0x245C4
+0x4163	0x2F923
+0x4164	0x2466B
+0x4165	0x24668
+0x4167	0x2465C
+0x4168	0x2465D
+0x4169	0x2466A
+0x416A	0x2F924
+0x416B	0x24C76
+0x416C	0x24776
+0x416E	0x247C4
+0x416F	0x247CB
+0x4170	0x247C8
+0x4171	0x247D4
+0x4172	0x247D5
+0x4173	0x247C9
+0x4174	0x247D7
+0x4176	0x24978
+0x4177	0x2495A
+0x4178	0x2495B
+0x4179	0x2495C
+0x417A	0x24956
+0x417B	0x24958
+0x417C	0x24971
+0x417D	0x269D4
+0x417E	0x24B40
+0x4221	0x2F933
+0x4222	0x24B3F
+0x4223	0x24B43
+0x4224	0x24B41
+0x4225	0x24BE2
+0x4226	0x24BE0
+0x4227	0x24BE3
+0x4228	0x24C66
+0x4229	0x24C73
+0x422A	0x24C6C
+0x422B	0x24C71
+0x422C	0x24C6A
+0x422D	0x24C6D
+0x422E	0x24C6E
+0x422F	0x24C6B
+0x4230	0x24D8C
+0x4231	0x24D77
+0x4232	0x2F93A
+0x4233	0x24D7F
+0x4234	0x24D89
+0x4235	0x24D7A
+0x4236	0x24D85
+0x4237	0x24D78
+0x4238	0x24D8A
+0x4239	0x24D86
+0x423A	0x24F2C
+0x423B	0x24F67
+0x423C	0x24F5B
+0x423D	0x24FE5
+0x423E	0x24FE1
+0x423F	0x25061
+0x4240	0x25069
+0x4241	0x2506A
+0x4242	0x25165
+0x4243	0x2516D
+0x4244	0x25163
+0x4245	0x25186
+0x4246	0x2515C
+0x4247	0x25162
+0x4248	0x2F948
+0x4249	0x25179
+0x424A	0x25169
+0x424B	0x25170
+0x424C	0x25176
+0x424D	0x2515D
+0x424E	0x25187
+0x424F	0x2516E
+0x4250	0x25171
+0x4251	0x2517C
+0x4252	0x25173
+0x4253	0x2515B
+0x4254	0x2516B
+0x4255	0x253BF
+0x4256	0x253C1
+0x4257	0x253BD
+0x4258	0x253C9
+0x4259	0x253BC
+0x425A	0x253C2
+0x425B	0x253C0
+0x425C	0x25492
+0x425D	0x254A9
+0x425E	0x2548F
+0x425F	0x25476
+0x4260	0x2547B
+0x4261	0x25475
+0x4262	0x254A4
+0x4263	0x25664
+0x4264	0x2573D
+0x4265	0x257AF
+0x4268	0x2579D
+0x4269	0x25799
+0x426A	0x257B1
+0x426B	0x25963
+0x426C	0x25962
+0x426D	0x25964
+0x426E	0x25969
+0x4270	0x25A75
+0x4271	0x25A73
+0x4272	0x25A71
+0x4273	0x25A74
+0x4274	0x25B0C
+0x4275	0x25B16
+0x4277	0x25B11
+0x4278	0x25B1F
+0x4279	0x25B1A
+0x427A	0x25B0D
+0x427B	0x25B1B
+0x427C	0x25B13
+0x427D	0x25E4E
+0x427E	0x25E55
+0x4321	0x25E50
+0x4323	0x25FD2
+0x4324	0x25FD3
+0x4325	0x25FD1
+0x4326	0x25FF1
+0x4327	0x25FDC
+0x4328	0x25FC8
+0x4329	0x25FCC
+0x432A	0x25FD0
+0x432B	0x25FCF
+0x432C	0x25FDF
+0x432D	0x2622B
+0x432E	0x2622E
+0x432F	0x2622D
+0x4330	0x2629D
+0x4331	0x2629E
+0x4332	0x2629F
+0x4333	0x262A9
+0x4334	0x262A0
+0x4335	0x26298
+0x4336	0x262A1
+0x4337	0x262AB
+0x4338	0x262AF
+0x4339	0x2636E
+0x433A	0x2635F
+0x433B	0x2635A
+0x433D	0x26365
+0x433E	0x26368
+0x433F	0x26372
+0x4340	0x26417
+0x4341	0x26416
+0x4342	0x26418
+0x4343	0x26419
+0x4344	0x2641A
+0x4345	0x26422
+0x4346	0x2641B
+0x4347	0x2641C
+0x4348	0x264BE
+0x4349	0x264EE
+0x434A	0x2655A
+0x434B	0x26550
+0x434C	0x26558
+0x434D	0x26554
+0x434E	0x26557
+0x434F	0x26556
+0x4350	0x26615
+0x4351	0x2669B
+0x4352	0x26693
+0x4353	0x26692
+0x4354	0x26672
+0x4355	0x26698
+0x4356	0x26699
+0x4357	0x266DF
+0x4359	0x266D5
+0x435B	0x266D4
+0x435C	0x266F3
+0x435D	0x266F4
+0x435E	0x266E7
+0x435F	0x266E1
+0x4360	0x266E6
+0x4361	0x266EB
+0x4362	0x266EC
+0x4363	0x202DB
+0x4365	0x2690D
+0x4366	0x2690C
+0x4367	0x21B2F
+0x4368	0x26968
+0x4369	0x26965
+0x436A	0x2696B
+0x436B	0x26969
+0x436C	0x269D1
+0x436D	0x269D3
+0x436E	0x26A27
+0x436F	0x26A28
+0x4372	0x26A24
+0x4373	0x26AD7
+0x4374	0x26BCA
+0x4375	0x26BC7
+0x4376	0x2F99E
+0x4377	0x26BD8
+0x4378	0x26BE1
+0x4379	0x26BC6
+0x437A	0x26BF8
+0x437B	0x26BC3
+0x437C	0x26BF4
+0x437D	0x26C17
+0x437E	0x26BEA
+0x4421	0x26BCB
+0x4422	0x26B86
+0x4423	0x26BC4
+0x4424	0x26BD9
+0x4425	0x26C19
+0x4426	0x26BC2
+0x4427	0x26BE2
+0x4429	0x26BDE
+0x442A	0x26BED
+0x442B	0x2F99C
+0x442D	0x26C1D
+0x442E	0x26BDD
+0x442F	0x26BDB
+0x4430	0x26BE8
+0x4431	0x26BE9
+0x4432	0x26BBF
+0x4433	0x26BE0
+0x4434	0x26BD1
+0x4435	0x26BDC
+0x4436	0x26BCE
+0x4437	0x26C1E
+0x4438	0x26BCC
+0x4439	0x26BF2
+0x443A	0x26BF3
+0x443B	0x2F99F
+0x443C	0x2F9A2
+0x443D	0x2F9A3
+0x443E	0x2F9A1
+0x443F	0x271AB
+0x4440	0x271AA
+0x4441	0x271A7
+0x4442	0x271A9
+0x4443	0x27288
+0x4444	0x27275
+0x4445	0x27260
+0x4446	0x2726C
+0x4447	0x27273
+0x4449	0x2726E
+0x444A	0x27274
+0x444B	0x27276
+0x444C	0x27268
+0x444D	0x27277
+0x444E	0x27286
+0x444F	0x275EA
+0x4450	0x27651
+0x4451	0x27650
+0x4452	0x27658
+0x4453	0x2764D
+0x4454	0x2764F
+0x4455	0x2764E
+0x4456	0x2765C
+0x4457	0x27652
+0x4458	0x27644
+0x4459	0x2764A
+0x445A	0x2764B
+0x445B	0x277EA
+0x445C	0x27810
+0x445D	0x27811
+0x445E	0x278CD
+0x445F	0x278BF
+0x4460	0x278C4
+0x4461	0x278D0
+0x4462	0x278CE
+0x4463	0x278C0
+0x4464	0x278C2
+0x4465	0x278CF
+0x4466	0x278C9
+0x4467	0x278BB
+0x4468	0x27997
+0x4469	0x27992
+0x446A	0x2796F
+0x446B	0x2797E
+0x446C	0x2799A
+0x446E	0x27986
+0x446F	0x27973
+0x4471	0x27977
+0x4472	0x2798F
+0x4473	0x27970
+0x4474	0x27981
+0x4475	0x27982
+0x4476	0x27999
+0x4477	0x2797D
+0x4478	0x2797F
+0x4479	0x2797B
+0x447A	0x27987
+0x447B	0x27BB2
+0x447C	0x27C2F
+0x447D	0x27C34
+0x447E	0x27C2E
+0x4521	0x27C32
+0x4523	0x27CAA
+0x4525	0x27CA9
+0x4526	0x27D38
+0x4527	0x27D36
+0x4528	0x27D37
+0x4529	0x27D47
+0x452A	0x27D33
+0x452B	0x27D39
+0x452C	0x27D35
+0x452D	0x27D44
+0x452E	0x27EA5
+0x452F	0x27EA6
+0x4530	0x27E9E
+0x4531	0x27FE3
+0x4532	0x27FDF
+0x4533	0x27FD3
+0x4534	0x27FF1
+0x4535	0x27FE4
+0x4536	0x27FE0
+0x4537	0x27FD6
+0x4539	0x27FE6
+0x453A	0x27FD8
+0x453B	0x27FDE
+0x453C	0x27FDB
+0x453D	0x27FDC
+0x453E	0x2821B
+0x453F	0x2821F
+0x4540	0x2821D
+0x4541	0x2821C
+0x4542	0x2821E
+0x4543	0x28220
+0x4544	0x28221
+0x4546	0x282B6
+0x4547	0x282BC
+0x4548	0x282C6
+0x4549	0x282C7
+0x454A	0x282BA
+0x454B	0x282BE
+0x454C	0x282BD
+0x454D	0x282B5
+0x454E	0x282B4
+0x454F	0x2840F
+0x4550	0x28462
+0x4551	0x284EB
+0x4552	0x284D9
+0x4553	0x284E4
+0x4554	0x284D7
+0x4555	0x284D8
+0x4556	0x284D6
+0x4557	0x284CE
+0x4558	0x284DD
+0x4559	0x284E7
+0x455A	0x284D2
+0x455B	0x284C5
+0x455C	0x284C9
+0x455D	0x284DB
+0x455E	0x28692
+0x455F	0x2868A
+0x4560	0x2868B
+0x4561	0x28689
+0x4562	0x28708
+0x4563	0x28703
+0x4564	0x28706
+0x4565	0x28705
+0x4566	0x286F5
+0x4567	0x2870B
+0x4568	0x286FB
+0x4569	0x287FC
+0x456A	0x28801
+0x456B	0x28802
+0x456C	0x287FA
+0x456D	0x28808
+0x456E	0x287F7
+0x456F	0x28800
+0x4570	0x287FF
+0x4571	0x28806
+0x4572	0x287F6
+0x4573	0x287FB
+0x4574	0x2880A
+0x4575	0x28925
+0x4576	0x28943
+0x4577	0x28944
+0x4578	0x28C64
+0x4579	0x28C62
+0x457A	0x28C5E
+0x457B	0x28C5B
+0x457C	0x28CD6
+0x457D	0x20072
+0x457E	0x200C2
+0x4621	0x28E77
+0x4622	0x28E82
+0x4623	0x28E7C
+0x4624	0x28E7D
+0x4625	0x28E86
+0x4626	0x28E81
+0x4627	0x28E84
+0x4628	0x28E76
+0x4629	0x28E83
+0x462A	0x28E7F
+0x462B	0x28E7E
+0x462C	0x28F88
+0x462D	0x28F8D
+0x462E	0x28F8B
+0x462F	0x28F91
+0x4630	0x28F8F
+0x4631	0x2907C
+0x4632	0x29079
+0x4633	0x2907A
+0x4634	0x291EA
+0x4635	0x2944C
+0x4636	0x29599
+0x4637	0x202D1
+0x4638	0x2968B
+0x4639	0x2968D
+0x463A	0x2968A
+0x463B	0x2968E
+0x463C	0x29811
+0x463D	0x22256
+0x463E	0x2FA15
+0x463F	0x20074
+0x4640	0x200C3
+0x4641	0x200C4
+0x4642	0x2011B
+0x4643	0x2015F
+0x4644	0x2016A
+0x4645	0x20169
+0x4646	0x2016B
+0x4647	0x2030C
+0x4648	0x202F6
+0x4649	0x202ED
+0x464A	0x20329
+0x464B	0x202FE
+0x464C	0x202F1
+0x464D	0x20317
+0x464E	0x202FF
+0x464F	0x202EE
+0x4650	0x202FD
+0x4651	0x2031C
+0x4652	0x202FC
+0x4653	0x20300
+0x4654	0x20320
+0x4656	0x202F9
+0x4657	0x20367
+0x4658	0x20308
+0x4659	0x2049E
+0x465A	0x204F3
+0x465B	0x20525
+0x465C	0x20527
+0x465D	0x2051F
+0x465E	0x20565
+0x465F	0x20563
+0x4660	0x20594
+0x4661	0x20597
+0x4662	0x205F1
+0x4663	0x2065F
+0x4664	0x20662
+0x4666	0x20660
+0x4667	0x2F822
+0x4668	0x2078C
+0x4669	0x20782
+0x466A	0x20790
+0x466B	0x2078B
+0x466C	0x2078D
+0x466D	0x20781
+0x466E	0x2079D
+0x466F	0x2088E
+0x4670	0x2088F
+0x4671	0x20892
+0x4672	0x20923
+0x4673	0x20952
+0x4674	0x2F82E
+0x4675	0x20A00
+0x4676	0x20A01
+0x4677	0x20A02
+0x4678	0x20A1F
+0x4679	0x20A8C
+0x467A	0x20A89
+0x467B	0x20A8B
+0x467C	0x20A88
+0x467D	0x20A8D
+0x467E	0x20A8F
+0x4721	0x26385
+0x4722	0x20B00
+0x4723	0x20B05
+0x4724	0x20B01
+0x4725	0x20B68
+0x4726	0x20B6E
+0x4727	0x20B67
+0x4728	0x20B75
+0x472A	0x2F845
+0x472B	0x20DD7
+0x472C	0x2F846
+0x472D	0x20048
+0x472E	0x20DD4
+0x472F	0x20DD8
+0x4730	0x2F847
+0x4731	0x2F848
+0x4732	0x20DBA
+0x4733	0x2F849
+0x4734	0x20DDB
+0x4735	0x20DBF
+0x4736	0x20E35
+0x4737	0x20DBC
+0x4738	0x20DD9
+0x473A	0x20DDD
+0x473B	0x20E00
+0x473C	0x20DD5
+0x473D	0x20E30
+0x473E	0x20DBD
+0x473F	0x20DDC
+0x4740	0x211FD
+0x4741	0x211FE
+0x4742	0x21207
+0x4743	0x24517
+0x4744	0x2136F
+0x4745	0x21369
+0x4746	0x21370
+0x4747	0x21367
+0x4748	0x213A9
+0x4749	0x21395
+0x474A	0x21390
+0x474B	0x2136C
+0x474C	0x21397
+0x474D	0x21371
+0x474F	0x21374
+0x4750	0x2136D
+0x4751	0x2138E
+0x4752	0x2152F
+0x4753	0x2A31B
+0x4754	0x215A9
+0x4755	0x2164E
+0x4756	0x2F85F
+0x4757	0x2165A
+0x4758	0x21648
+0x4759	0x21655
+0x475A	0x2164C
+0x475B	0x21649
+0x475C	0x2164F
+0x475D	0x2164A
+0x475E	0x217D6
+0x475F	0x217A0
+0x4760	0x217A9
+0x4761	0x2F867
+0x4762	0x2179D
+0x4763	0x217D4
+0x4764	0x217A4
+0x4765	0x217A8
+0x4766	0x217A6
+0x4767	0x217E6
+0x4768	0x2197D
+0x4769	0x21977
+0x476A	0x2197A
+0x476B	0x21A41
+0x476C	0x21A49
+0x476D	0x21A59
+0x476E	0x21A45
+0x476F	0x21A48
+0x4770	0x21A40
+0x4771	0x21B8E
+0x4772	0x21B95
+0x4773	0x21B90
+0x4774	0x21BF7
+0x4775	0x21BF8
+0x4776	0x21BF6
+0x4777	0x21BFB
+0x4778	0x21C9E
+0x4779	0x21C9D
+0x477A	0x21C99
+0x477B	0x2F877
+0x477C	0x21CA3
+0x477D	0x21CA9
+0x477E	0x21C98
+0x4821	0x21CA0
+0x4822	0x21C96
+0x4823	0x21C94
+0x4824	0x21C95
+0x4825	0x21C9F
+0x4826	0x21CA1
+0x4827	0x21D21
+0x4828	0x21D1D
+0x4829	0x21D1F
+0x482A	0x21E6D
+0x482B	0x2F87C
+0x482C	0x21E9A
+0x482D	0x21E92
+0x482E	0x21E7A
+0x482F	0x21E7D
+0x4830	0x21EA1
+0x4831	0x21E9D
+0x4832	0x21E99
+0x4833	0x21E6B
+0x4834	0x21E6E
+0x4835	0x2F87D
+0x4836	0x22045
+0x4837	0x2F884
+0x4838	0x220FB
+0x4839	0x220EB
+0x483A	0x220F2
+0x483B	0x220F9
+0x483C	0x2F886
+0x483D	0x220F8
+0x483E	0x220ED
+0x483F	0x22101
+0x4840	0x220F7
+0x4841	0x22106
+0x4842	0x2219B
+0x4843	0x221CA
+0x4846	0x2226B
+0x4847	0x2226C
+0x4848	0x22274
+0x4849	0x22267
+0x484A	0x2225B
+0x484B	0x22260
+0x484C	0x22276
+0x484D	0x22263
+0x484E	0x22261
+0x484F	0x22328
+0x4850	0x2235B
+0x4851	0x2235E
+0x4852	0x22360
+0x4853	0x2235D
+0x4854	0x2235C
+0x4855	0x223F4
+0x4856	0x22400
+0x4857	0x22408
+0x4858	0x22407
+0x4859	0x22401
+0x485A	0x22405
+0x485B	0x22464
+0x485C	0x22463
+0x485D	0x2249E
+0x485E	0x224A0
+0x485F	0x224A1
+0x4860	0x2249F
+0x4861	0x22526
+0x4862	0x2252D
+0x4863	0x22528
+0x4864	0x2251D
+0x4865	0x226EC
+0x4866	0x226E3
+0x4867	0x226EB
+0x4868	0x22716
+0x4869	0x226C8
+0x486A	0x2661B
+0x486B	0x226E9
+0x486C	0x226E4
+0x486D	0x22724
+0x486E	0x226D1
+0x4870	0x226DD
+0x4871	0x226C2
+0x4872	0x226CB
+0x4873	0x226C7
+0x4874	0x226E7
+0x4876	0x226EA
+0x4877	0x2274B
+0x4878	0x2F8A5
+0x4879	0x22760
+0x487A	0x2277D
+0x487B	0x2273E
+0x487C	0x2F8A4
+0x487D	0x22752
+0x487E	0x2274E
+0x4921	0x2273C
+0x4922	0x22732
+0x4923	0x22730
+0x4924	0x22723
+0x4925	0x229CA
+0x4926	0x229CB
+0x4927	0x229C9
+0x4928	0x229C8
+0x4929	0x229CD
+0x492A	0x22B98
+0x492B	0x22BA0
+0x492C	0x22B9F
+0x492D	0x22B9C
+0x492E	0x22BA3
+0x492F	0x22B97
+0x4930	0x2F8BE
+0x4931	0x22BF1
+0x4932	0x22C09
+0x4933	0x22C03
+0x4934	0x22BEA
+0x4935	0x22C45
+0x4936	0x22BED
+0x4937	0x22C05
+0x4938	0x22C1A
+0x4939	0x22C15
+0x493A	0x22C01
+0x493B	0x22BEC
+0x493C	0x22C0E
+0x493D	0x22C17
+0x493E	0x22C42
+0x493F	0x22C12
+0x4940	0x22C10
+0x4941	0x22BEF
+0x4942	0x22BFF
+0x4943	0x22C00
+0x4944	0x22C0C
+0x4945	0x22C0F
+0x4946	0x22C04
+0x4947	0x22C08
+0x4948	0x22C14
+0x4949	0x22C43
+0x494A	0x2F8BD
+0x494B	0x22C1B
+0x494C	0x22C11
+0x494D	0x22C13
+0x494E	0x22ECF
+0x494F	0x22ECE
+0x4950	0x22F6F
+0x4951	0x22F6E
+0x4952	0x22F7A
+0x4953	0x22F70
+0x4954	0x22F64
+0x4955	0x22F5E
+0x4956	0x22F6C
+0x4957	0x2F8C9
+0x4958	0x22F5B
+0x4959	0x22F61
+0x495A	0x22F65
+0x495B	0x2307F
+0x495C	0x23080
+0x495D	0x2307C
+0x495E	0x230A7
+0x495F	0x230A6
+0x4960	0x230A1
+0x4962	0x230A8
+0x4963	0x230A3
+0x4964	0x230A2
+0x4965	0x230AD
+0x4966	0x230A5
+0x4967	0x23101
+0x4968	0x230FF
+0x4969	0x230FC
+0x496A	0x23100
+0x496B	0x23135
+0x496C	0x231EE
+0x496D	0x231EF
+0x496E	0x231F6
+0x496F	0x231E8
+0x4970	0x231EA
+0x4971	0x231E3
+0x4972	0x2321F
+0x4974	0x231E4
+0x4975	0x231FA
+0x4976	0x231F1
+0x4977	0x231FB
+0x4978	0x2F8D4
+0x4979	0x2333D
+0x497A	0x2333C
+0x497C	0x23378
+0x497D	0x23377
+0x4A21	0x234D1
+0x4A22	0x234C7
+0x4A23	0x234DF
+0x4A24	0x234D0
+0x4A25	0x234E0
+0x4A26	0x234D6
+0x4A27	0x234D8
+0x4A28	0x23516
+0x4A29	0x2350E
+0x4A2A	0x234D9
+0x4A2B	0x2350F
+0x4A2C	0x23511
+0x4A2D	0x234CD
+0x4A2E	0x23489
+0x4A2F	0x234CE
+0x4A30	0x23514
+0x4A31	0x234DA
+0x4A32	0x23512
+0x4A33	0x234D3
+0x4A34	0x234C2
+0x4A35	0x234E1
+0x4A36	0x234E9
+0x4A37	0x234EA
+0x4A38	0x234DE
+0x4A39	0x23515
+0x4A3A	0x238D9
+0x4A3B	0x238D6
+0x4A3C	0x238CD
+0x4A3D	0x238D0
+0x4A3E	0x238D3
+0x4A3F	0x2F8F0
+0x4A40	0x23982
+0x4A41	0x23985
+0x4A42	0x2397F
+0x4A43	0x2397D
+0x4A44	0x23981
+0x4A45	0x23983
+0x4A46	0x23984
+0x4A47	0x284A0
+0x4A48	0x23A28
+0x4A49	0x23A0F
+0x4A4A	0x23A17
+0x4A4B	0x23A1A
+0x4A4C	0x23A25
+0x4A4D	0x2F8F7
+0x4A4E	0x23A9B
+0x4A4F	0x23A99
+0x4A50	0x23B92
+0x4A51	0x23B8C
+0x4A52	0x23B95
+0x4A53	0x23B8D
+0x4A54	0x23BA3
+0x4A55	0x23B93
+0x4A56	0x23B91
+0x4A57	0x23DDB
+0x4A58	0x23D99
+0x4A59	0x23D9A
+0x4A5A	0x23E08
+0x4A5B	0x23E4C
+0x4A5C	0x23E0D
+0x4A5D	0x23E01
+0x4A5E	0x23E4E
+0x4A5F	0x23E02
+0x4A60	0x23E4D
+0x4A61	0x23E21
+0x4A62	0x23DFC
+0x4A63	0x2F909
+0x4A64	0x23D8A
+0x4A65	0x2F908
+0x4A66	0x23D95
+0x4A67	0x23E11
+0x4A68	0x23E12
+0x4A69	0x23E46
+0x4A6A	0x23E1C
+0x4A6B	0x23E49
+0x4A6C	0x23E0C
+0x4A6E	0x23E13
+0x4A6F	0x23E16
+0x4A70	0x23DFD
+0x4A71	0x23E0F
+0x4A72	0x23E1F
+0x4A73	0x24230
+0x4A74	0x2426E
+0x4A75	0x2426B
+0x4A76	0x2429B
+0x4A77	0x2427B
+0x4A78	0x24263
+0x4A79	0x24297
+0x4A7A	0x2426D
+0x4A7B	0x2429C
+0x4A7C	0x24298
+0x4A7D	0x2426F
+0x4A7E	0x24267
+0x4B21	0x24269
+0x4B22	0x24515
+0x4B23	0x24563
+0x4B24	0x24586
+0x4B25	0x2458A
+0x4B26	0x24587
+0x4B27	0x24588
+0x4B28	0x24585
+0x4B29	0x24589
+0x4B2A	0x245CA
+0x4B2B	0x245C7
+0x4B2C	0x245CB
+0x4B2D	0x245CC
+0x4B2E	0x245C9
+0x4B2F	0x2460D
+0x4B30	0x24683
+0x4B31	0x24684
+0x4B32	0x24678
+0x4B33	0x24682
+0x4B34	0x24673
+0x4B35	0x24679
+0x4B36	0x2468C
+0x4B37	0x247D0
+0x4B38	0x247CF
+0x4B39	0x247D2
+0x4B3A	0x247D9
+0x4B3B	0x247CC
+0x4B3C	0x247EB
+0x4B3D	0x247FD
+0x4B3E	0x247EC
+0x4B3F	0x247E8
+0x4B40	0x247F8
+0x4B41	0x247FA
+0x4B42	0x2F927
+0x4B44	0x247E1
+0x4B45	0x247FB
+0x4B46	0x248E7
+0x4B47	0x2F92E
+0x4B48	0x249A5
+0x4B49	0x24991
+0x4B4A	0x249A6
+0x4B4B	0x2497C
+0x4B4C	0x24992
+0x4B4D	0x249A2
+0x4B4E	0x249A0
+0x4B4F	0x24AFC
+0x4B50	0x24AFE
+0x4B51	0x24B57
+0x4B52	0x24B53
+0x4B53	0x24B58
+0x4B54	0x24BE7
+0x4B55	0x24C8E
+0x4B56	0x2F938
+0x4B57	0x24C83
+0x4B58	0x24C8B
+0x4B59	0x24C84
+0x4B5B	0x24DA2
+0x4B5C	0x24DB7
+0x4B5D	0x24DA9
+0x4B5E	0x24DA5
+0x4B5F	0x24D9F
+0x4B60	0x24DAA
+0x4B61	0x24D97
+0x4B62	0x24DA1
+0x4B63	0x24D9E
+0x4B64	0x24DAB
+0x4B65	0x24D99
+0x4B66	0x24DA3
+0x4B67	0x24F30
+0x4B68	0x24F32
+0x4B69	0x24F2F
+0x4B6A	0x24F70
+0x4B6B	0x24F6C
+0x4B6C	0x24F6F
+0x4B6D	0x24FE8
+0x4B6E	0x24FEE
+0x4B6F	0x24FEA
+0x4B70	0x2506D
+0x4B71	0x25076
+0x4B72	0x25070
+0x4B73	0x25071
+0x4B74	0x2506C
+0x4B75	0x251EB
+0x4B76	0x251B5
+0x4B77	0x25196
+0x4B78	0x25190
+0x4B79	0x2518D
+0x4B7A	0x2F949
+0x4B7B	0x251A2
+0x4B7C	0x251B0
+0x4B7D	0x25192
+0x4B7E	0x251A0
+0x4C21	0x25193
+0x4C22	0x251C3
+0x4C23	0x2518E
+0x4C24	0x251B6
+0x4C25	0x2519D
+0x4C26	0x25195
+0x4C27	0x251B3
+0x4C28	0x251A4
+0x4C29	0x25370
+0x4C2A	0x253D4
+0x4C2C	0x253CF
+0x4C2D	0x20170
+0x4C2E	0x25494
+0x4C30	0x254C0
+0x4C31	0x254B4
+0x4C32	0x254C1
+0x4C34	0x254BD
+0x4C35	0x254AF
+0x4C36	0x25677
+0x4C37	0x25678
+0x4C38	0x2566B
+0x4C39	0x2566D
+0x4C3A	0x2566E
+0x4C3B	0x25672
+0x4C3C	0x2566F
+0x4C3D	0x25671
+0x4C3E	0x230AB
+0x4C3F	0x2568C
+0x4C40	0x2573F
+0x4C41	0x257B6
+0x4C42	0x257B7
+0x4C44	0x257BB
+0x4C45	0x257B8
+0x4C46	0x2079C
+0x4C47	0x257B9
+0x4C49	0x2598B
+0x4C4A	0x2597A
+0x4C4B	0x25984
+0x4C4C	0x25988
+0x4C4D	0x25991
+0x4C4E	0x25979
+0x4C4F	0x2598E
+0x4C50	0x25980
+0x4C51	0x25982
+0x4C52	0x2597C
+0x4C54	0x25A84
+0x4C55	0x25A7F
+0x4C57	0x25B3B
+0x4C58	0x25B71
+0x4C59	0x25B3D
+0x4C5A	0x25B30
+0x4C5C	0x25B3E
+0x4C5D	0x25B38
+0x4C5E	0x25E5E
+0x4C5F	0x25E64
+0x4C61	0x25E5D
+0x4C62	0x25E6D
+0x4C63	0x25E4F
+0x4C64	0x25E62
+0x4C65	0x25E5F
+0x4C66	0x25FEC
+0x4C67	0x25FF2
+0x4C68	0x25FF4
+0x4C69	0x25FF7
+0x4C6A	0x25FF6
+0x4C6B	0x26007
+0x4C6C	0x25FED
+0x4C6D	0x25FEA
+0x4C6E	0x25FF0
+0x4C6F	0x25FF8
+0x4C70	0x25FF3
+0x4C72	0x2F972
+0x4C73	0x26231
+0x4C74	0x2622F
+0x4C75	0x262B6
+0x4C76	0x262AE
+0x4C77	0x262AA
+0x4C78	0x262BF
+0x4C79	0x262CC
+0x4C7A	0x262C7
+0x4C7B	0x26C83
+0x4C7C	0x26380
+0x4C7D	0x2637B
+0x4C7E	0x2637F
+0x4D21	0x2637D
+0x4D22	0x26383
+0x4D23	0x2F978
+0x4D24	0x26446
+0x4D25	0x2642D
+0x4D26	0x26425
+0x4D27	0x26426
+0x4D28	0x2642C
+0x4D29	0x26437
+0x4D2A	0x26431
+0x4D2B	0x26433
+0x4D2C	0x26432
+0x4D2D	0x26427
+0x4D2E	0x2642A
+0x4D2F	0x2642E
+0x4D30	0x2642F
+0x4D31	0x264C0
+0x4D32	0x26571
+0x4D33	0x26561
+0x4D34	0x26562
+0x4D35	0x26566
+0x4D36	0x26618
+0x4D37	0x266C5
+0x4D38	0x266C3
+0x4D39	0x266C4
+0x4D3A	0x266C2
+0x4D3B	0x266AE
+0x4D3C	0x26710
+0x4D3D	0x26708
+0x4D3E	0x2671F
+0x4D3F	0x2673A
+0x4D40	0x2673B
+0x4D41	0x26736
+0x4D42	0x2670C
+0x4D43	0x26706
+0x4D44	0x2672A
+0x4D45	0x26757
+0x4D46	0x26750
+0x4D47	0x26720
+0x4D48	0x2F985
+0x4D49	0x2672C
+0x4D4A	0x26721
+0x4D4B	0x2670B
+0x4D4C	0x26719
+0x4D4D	0x26735
+0x4D4E	0x26718
+0x4D4F	0x2670F
+0x4D50	0x26713
+0x4D51	0x26755
+0x4D52	0x26739
+0x4D53	0x2671A
+0x4D55	0x26717
+0x4D56	0x268E4
+0x4D57	0x268E9
+0x4D58	0x2458B
+0x4D59	0x26910
+0x4D5A	0x26912
+0x4D5B	0x2693F
+0x4D5C	0x2696E
+0x4D5D	0x24518
+0x4D5E	0x2F98C
+0x4D5F	0x269D6
+0x4D60	0x269D5
+0x4D61	0x269D7
+0x4D62	0x20B02
+0x4D64	0x26A31
+0x4D65	0x26A30
+0x4D66	0x26A3A
+0x4D67	0x26B85
+0x4D68	0x26B6B
+0x4D69	0x26C48
+0x4D6A	0x26C4B
+0x4D6B	0x26C37
+0x4D6C	0x26C7B
+0x4D6D	0x26C6C
+0x4D6E	0x26C85
+0x4D6F	0x26C65
+0x4D70	0x26C36
+0x4D71	0x26C86
+0x4D72	0x26C34
+0x4D73	0x26C68
+0x4D74	0x26C5A
+0x4D75	0x26C58
+0x4D76	0x26C72
+0x4D77	0x26C6A
+0x4D78	0x26BD3
+0x4D79	0x26C3C
+0x4D7A	0x26C33
+0x4D7B	0x26C3B
+0x4D7C	0x26C4D
+0x4D7D	0x26C4F
+0x4D7E	0x26C7C
+0x4E21	0x26CB0
+0x4E22	0x26C5B
+0x4E23	0x26C55
+0x4E24	0x26C64
+0x4E25	0x26C6B
+0x4E26	0x26C53
+0x4E28	0x26C57
+0x4E29	0x26C5E
+0x4E2A	0x26C6D
+0x4E2B	0x26C35
+0x4E2C	0x26C69
+0x4E2D	0x26C59
+0x4E2E	0x26C66
+0x4E2F	0x26C50
+0x4E30	0x26C51
+0x4E31	0x26C5C
+0x4E32	0x26D5D
+0x4E33	0x26C87
+0x4E34	0x26C78
+0x4E35	0x26C49
+0x4E36	0x26C4E
+0x4E37	0x26BF1
+0x4E38	0x26C73
+0x4E39	0x26C88
+0x4E3A	0x26BCF
+0x4E3B	0x2F9A4
+0x4E3C	0x271B1
+0x4E3D	0x271B3
+0x4E3E	0x2729C
+0x4E3F	0x272A4
+0x4E40	0x27290
+0x4E41	0x272B8
+0x4E42	0x272A0
+0x4E43	0x2729D
+0x4E44	0x272A8
+0x4E45	0x272A9
+0x4E46	0x2F9B9
+0x4E47	0x272B1
+0x4E48	0x27293
+0x4E49	0x2729B
+0x4E4A	0x272A2
+0x4E4B	0x272A1
+0x4E4C	0x272B0
+0x4E4D	0x272A7
+0x4E4E	0x275B3
+0x4E50	0x275B4
+0x4E51	0x275F1
+0x4E52	0x275ED
+0x4E53	0x275EC
+0x4E54	0x27668
+0x4E55	0x27675
+0x4E56	0x2766A
+0x4E57	0x27662
+0x4E58	0x27667
+0x4E59	0x27660
+0x4E5A	0x27677
+0x4E5B	0x2765F
+0x4E5C	0x27679
+0x4E5D	0x27823
+0x4E5E	0x27821
+0x4E5F	0x2781C
+0x4E61	0x2781F
+0x4E62	0x2781E
+0x4E63	0x278D6
+0x4E64	0x278D3
+0x4E65	0x278D9
+0x4E66	0x278D7
+0x4E67	0x278D4
+0x4E68	0x278DC
+0x4E69	0x278D8
+0x4E6A	0x279A3
+0x4E6C	0x279BE
+0x4E6D	0x279A9
+0x4E6E	0x279A1
+0x4E6F	0x279A0
+0x4E70	0x279AB
+0x4E71	0x279A2
+0x4E72	0x279BA
+0x4E73	0x279C2
+0x4E74	0x2799C
+0x4E75	0x279BB
+0x4E76	0x279AA
+0x4E77	0x279AC
+0x4E78	0x279A5
+0x4E79	0x279C1
+0x4E7B	0x27BE2
+0x4E7C	0x27C36
+0x4E7D	0x27C3D
+0x4E7E	0x27C3A
+0x4F21	0x22461
+0x4F22	0x27C48
+0x4F23	0x27C3C
+0x4F24	0x27CB7
+0x4F25	0x27CAC
+0x4F26	0x27CB3
+0x4F27	0x27CB6
+0x4F28	0x27CB2
+0x4F2A	0x27D5D
+0x4F2B	0x27D49
+0x4F2C	0x27D4E
+0x4F2D	0x27D4F
+0x4F2E	0x27D4D
+0x4F2F	0x27D5C
+0x4F30	0x27E5D
+0x4F31	0x27EBB
+0x4F32	0x27ECE
+0x4F33	0x27EBF
+0x4F34	0x27EBA
+0x4F35	0x27EC3
+0x4F37	0x28006
+0x4F38	0x27FF8
+0x4F39	0x27FFE
+0x4F3A	0x28013
+0x4F3B	0x27FF6
+0x4F3D	0x28234
+0x4F3E	0x2822D
+0x4F3F	0x2822A
+0x4F40	0x28235
+0x4F41	0x2822C
+0x4F42	0x282D4
+0x4F43	0x282DA
+0x4F44	0x282D3
+0x4F45	0x282D2
+0x4F46	0x282CE
+0x4F47	0x282CF
+0x4F49	0x284FD
+0x4F4A	0x2850B
+0x4F4B	0x284FE
+0x4F4C	0x284F8
+0x4F4D	0x284F7
+0x4F4E	0x28517
+0x4F4F	0x284FA
+0x4F50	0x284F9
+0x4F51	0x28500
+0x4F52	0x284F5
+0x4F53	0x284F1
+0x4F54	0x28503
+0x4F55	0x28505
+0x4F56	0x2851C
+0x4F57	0x286AC
+0x4F58	0x2869A
+0x4F59	0x286AD
+0x4F5A	0x286A0
+0x4F5B	0x2871B
+0x4F5C	0x28725
+0x4F5D	0x28724
+0x4F5E	0x28726
+0x4F5F	0x28727
+0x4F60	0x28728
+0x4F61	0x2872A
+0x4F62	0x2871A
+0x4F63	0x2872E
+0x4F64	0x28715
+0x4F65	0x28815
+0x4F66	0x28814
+0x4F67	0x28817
+0x4F68	0x28818
+0x4F69	0x2880F
+0x4F6A	0x28813
+0x4F6B	0x2880B
+0x4F6C	0x28822
+0x4F6D	0x2137A
+0x4F6E	0x28926
+0x4F70	0x28951
+0x4F71	0x2894D
+0x4F72	0x2894E
+0x4F73	0x2894A
+0x4F74	0x2894B
+0x4F75	0x2894C
+0x4F76	0x28950
+0x4F77	0x28962
+0x4F78	0x2894F
+0x4F79	0x28952
+0x4F7A	0x28C68
+0x4F7B	0x28C69
+0x4F7C	0x28CE5
+0x4F7D	0x28CF0
+0x4F7E	0x28CE1
+0x5021	0x28CE2
+0x5022	0x2F9F2
+0x5023	0x28EA5
+0x5024	0x28EA9
+0x5025	0x28EA4
+0x5026	0x28EAF
+0x5027	0x28EAC
+0x5028	0x28EAE
+0x5029	0x28EAA
+0x502A	0x28F95
+0x502B	0x28F99
+0x502C	0x28F93
+0x502D	0x28F9D
+0x502E	0x28F98
+0x502F	0x28F9C
+0x5030	0x28F97
+0x5032	0x29089
+0x5033	0x29087
+0x5034	0x291D7
+0x5035	0x291ED
+0x5036	0x291F1
+0x5037	0x291F0
+0x5038	0x29205
+0x5039	0x29203
+0x503A	0x29204
+0x503B	0x2925F
+0x503C	0x29457
+0x503D	0x2959C
+0x503E	0x295A1
+0x503F	0x2959A
+0x5040	0x2968F
+0x5041	0x29693
+0x5042	0x2969E
+0x5043	0x296A3
+0x5044	0x29698
+0x5045	0x29699
+0x5046	0x29695
+0x5047	0x2986E
+0x5048	0x2986A
+0x5049	0x29AF4
+0x504A	0x29AF7
+0x504B	0x29C79
+0x504C	0x29F8F
+0x504D	0x29F91
+0x504E	0x2A00B
+0x504F	0x2A502
+0x5050	0x20084
+0x5051	0x20104
+0x5052	0x20180
+0x5053	0x2032F
+0x5054	0x2033F
+0x5055	0x2033B
+0x5056	0x20362
+0x5057	0x20344
+0x5058	0x20333
+0x5059	0x2035F
+0x505A	0x2032B
+0x505B	0x2F809
+0x505C	0x20339
+0x505D	0x20336
+0x505E	0x20348
+0x505F	0x20335
+0x5060	0x2036C
+0x5061	0x20358
+0x5062	0x2033A
+0x5063	0x204A8
+0x5064	0x204F4
+0x5065	0x20529
+0x5066	0x2059A
+0x5067	0x20600
+0x5068	0x207BB
+0x5069	0x207BD
+0x506A	0x207B7
+0x506B	0x207B2
+0x506D	0x207A8
+0x506E	0x207AB
+0x506F	0x207A6
+0x5070	0x207BC
+0x5071	0x20897
+0x5072	0x20896
+0x5073	0x208F8
+0x5075	0x20951
+0x5077	0x209B5
+0x5078	0x209B4
+0x5079	0x209B6
+0x507B	0x209B7
+0x507C	0x20A05
+0x507D	0x20A23
+0x507E	0x20A95
+0x5121	0x20A98
+0x5123	0x20A94
+0x5124	0x20A93
+0x5125	0x20B07
+0x5126	0x20B73
+0x5127	0x20B71
+0x5128	0x20B72
+0x5129	0x20B78
+0x512A	0x20E5F
+0x512B	0x20E6A
+0x512C	0x20E67
+0x512D	0x20E6B
+0x512E	0x20E69
+0x512F	0x20E8E
+0x5130	0x20E49
+0x5131	0x20E80
+0x5133	0x20E44
+0x5134	0x20E8F
+0x5135	0x20E45
+0x5136	0x2F84C
+0x5137	0x20E4F
+0x5138	0x20E63
+0x5139	0x20E36
+0x513A	0x20E48
+0x513B	0x20E5C
+0x513C	0x20E93
+0x513D	0x20E61
+0x513E	0x20E60
+0x513F	0x20E4E
+0x5140	0x20E5E
+0x5141	0x20E3F
+0x5142	0x20EA4
+0x5144	0x20E68
+0x5145	0x2120B
+0x5146	0x21211
+0x5147	0x2120D
+0x5148	0x2120E
+0x5149	0x213C2
+0x514A	0x2F857
+0x514B	0x213B0
+0x514C	0x213C3
+0x514D	0x213C8
+0x514E	0x21365
+0x514F	0x213D7
+0x5150	0x213BD
+0x5151	0x213B8
+0x5152	0x213B6
+0x5153	0x213C7
+0x5154	0x213BC
+0x5155	0x213B1
+0x5156	0x213AF
+0x5157	0x2F85B
+0x5158	0x21535
+0x5159	0x21530
+0x515A	0x2155D
+0x515B	0x20B76
+0x515C	0x2156F
+0x515D	0x215B0
+0x515E	0x2F85E
+0x515F	0x215B4
+0x5160	0x2165C
+0x5161	0x2165D
+0x5162	0x21808
+0x5163	0x217EE
+0x5164	0x2180B
+0x5165	0x217F2
+0x5166	0x217FD
+0x5167	0x217F1
+0x5168	0x21810
+0x5169	0x2F868
+0x516A	0x21814
+0x516B	0x2198B
+0x516C	0x2198C
+0x516D	0x21985
+0x516E	0x21A7A
+0x516F	0x21A6C
+0x5170	0x21A60
+0x5171	0x21A67
+0x5172	0x21A66
+0x5173	0x21A6A
+0x5174	0x21A5F
+0x5175	0x21A6D
+0x5176	0x21A68
+0x5177	0x21A64
+0x5178	0x21B3A
+0x5179	0x21B3B
+0x517A	0x21B39
+0x517B	0x21C02
+0x517C	0x21C04
+0x517D	0x21C03
+0x517E	0x21CB4
+0x5221	0x21CB3
+0x5222	0x21CBB
+0x5223	0x21CAC
+0x5224	0x21CB6
+0x5225	0x21CB1
+0x5226	0x21CAF
+0x5227	0x21CB5
+0x5228	0x21CBE
+0x5229	0x21CB2
+0x522A	0x21D24
+0x522B	0x21EB6
+0x522C	0x21EB9
+0x522D	0x21EAC
+0x522E	0x21EB0
+0x522F	0x21ED7
+0x5230	0x21EBB
+0x5231	0x21EFE
+0x5232	0x21ECB
+0x5233	0x2F87F
+0x5235	0x21EB3
+0x5236	0x21EBE
+0x5237	0x21ECD
+0x5238	0x21EBC
+0x5239	0x21EBA
+0x523A	0x21EC7
+0x523B	0x22116
+0x523C	0x2211B
+0x523D	0x22117
+0x523E	0x22115
+0x523F	0x2219F
+0x5240	0x2F88E
+0x5241	0x22282
+0x5242	0x22283
+0x5243	0x2228E
+0x5244	0x2226A
+0x5245	0x22289
+0x5246	0x22294
+0x5247	0x22286
+0x5248	0x22290
+0x5249	0x22362
+0x524A	0x22390
+0x524B	0x2240C
+0x524C	0x2240F
+0x524E	0x224A5
+0x524F	0x224A7
+0x5250	0x224A6
+0x5251	0x224A4
+0x5252	0x22535
+0x5253	0x22538
+0x5254	0x22536
+0x5255	0x22543
+0x5256	0x22547
+0x5257	0x22537
+0x5258	0x22743
+0x5259	0x227A2
+0x525A	0x22751
+0x525B	0x22772
+0x525C	0x2276D
+0x525D	0x2272F
+0x525E	0x22754
+0x525F	0x2276E
+0x5260	0x22755
+0x5261	0x22737
+0x5262	0x2274F
+0x5263	0x22750
+0x5265	0x2279E
+0x5266	0x2F8A8
+0x5267	0x227B3
+0x5268	0x227A7
+0x526A	0x227F9
+0x526B	0x22791
+0x526C	0x2F8A7
+0x526D	0x227B6
+0x526E	0x227DD
+0x526F	0x22799
+0x5270	0x229DF
+0x5271	0x229D5
+0x5272	0x247F5
+0x5273	0x22C28
+0x5274	0x22C40
+0x5275	0x22C71
+0x5276	0x22C98
+0x5277	0x22C95
+0x5278	0x22C65
+0x5279	0x22C78
+0x527A	0x22C7F
+0x527B	0x22C60
+0x527C	0x22C7C
+0x527D	0x22C96
+0x527E	0x22C6A
+0x5321	0x22C79
+0x5322	0x22C73
+0x5323	0x22C72
+0x5324	0x22C7B
+0x5325	0x22C70
+0x5326	0x22ED5
+0x5327	0x22ED7
+0x5328	0x22F8F
+0x5329	0x22F89
+0x532A	0x22F9E
+0x532B	0x22F87
+0x532C	0x22FA0
+0x532D	0x22F8D
+0x532E	0x22F88
+0x532F	0x22F7F
+0x5330	0x22F8C
+0x5331	0x22F93
+0x5332	0x23059
+0x5333	0x295B0
+0x5334	0x230B1
+0x5335	0x251F4
+0x5336	0x230AF
+0x5337	0x230B2
+0x5338	0x23108
+0x5339	0x2310A
+0x533A	0x23136
+0x533B	0x23137
+0x533C	0x2F8CF
+0x533E	0x23236
+0x533F	0x23229
+0x5340	0x2324A
+0x5341	0x23226
+0x5342	0x23228
+0x5343	0x23224
+0x5344	0x2322A
+0x5345	0x23248
+0x5346	0x23344
+0x5347	0x23384
+0x5348	0x2338C
+0x5349	0x234C4
+0x534A	0x234DC
+0x534B	0x23587
+0x534C	0x23553
+0x534D	0x2357F
+0x534E	0x23531
+0x534F	0x23551
+0x5350	0x2354B
+0x5351	0x23552
+0x5352	0x23580
+0x5353	0x235A5
+0x5354	0x23581
+0x5355	0x23543
+0x5356	0x23534
+0x5357	0x23536
+0x5358	0x23532
+0x5359	0x23548
+0x535A	0x23549
+0x535B	0x2353C
+0x535C	0x2354D
+0x535D	0x2354A
+0x535E	0x2F8E6
+0x535F	0x2358A
+0x5360	0x23546
+0x5361	0x2353E
+0x5362	0x23583
+0x5363	0x23550
+0x5364	0x235B4
+0x5365	0x238F0
+0x5366	0x238E4
+0x5367	0x238E3
+0x5368	0x238E5
+0x5369	0x238E6
+0x536A	0x238E7
+0x536B	0x238E1
+0x536C	0x238EF
+0x536D	0x238E8
+0x536E	0x238DD
+0x536F	0x23903
+0x5370	0x23988
+0x5371	0x23A26
+0x5372	0x23A16
+0x5373	0x23A3B
+0x5374	0x23A2F
+0x5375	0x23A39
+0x5376	0x23A34
+0x5377	0x2F8F4
+0x5378	0x23A35
+0x5379	0x23A31
+0x537A	0x23A38
+0x537B	0x20B81
+0x537C	0x23AAA
+0x537D	0x23AA3
+0x537E	0x23AA4
+0x5421	0x23AA0
+0x5422	0x23AA1
+0x5423	0x23AA9
+0x5424	0x23AA5
+0x5425	0x23BAF
+0x5426	0x23BB1
+0x5427	0x23BAB
+0x5428	0x23BAE
+0x5429	0x23BB0
+0x542A	0x23BB3
+0x542B	0x23BAC
+0x542C	0x23BA9
+0x542D	0x23BB2
+0x542E	0x23BA8
+0x542F	0x23BB4
+0x5430	0x23BC2
+0x5431	0x23C4F
+0x5432	0x23C66
+0x5433	0x23E1E
+0x5434	0x23E15
+0x5435	0x23E10
+0x5436	0x23E7F
+0x5437	0x23E7E
+0x5438	0x23E60
+0x5439	0x23ECC
+0x543A	0x23EB2
+0x543B	0x23E62
+0x543C	0x23E8D
+0x543D	0x23E8E
+0x543E	0x23E77
+0x543F	0x23E7C
+0x5440	0x23E8F
+0x5441	0x23E5D
+0x5442	0x23E6D
+0x5443	0x23E63
+0x5444	0x23EAF
+0x5445	0x23E90
+0x5446	0x23E7D
+0x5447	0x23E7A
+0x5448	0x23E06
+0x5449	0x2F90B
+0x544A	0x23E68
+0x544B	0x23EB4
+0x544C	0x23E78
+0x544D	0x23EB1
+0x544F	0x2F90C
+0x5451	0x242E8
+0x5452	0x242E9
+0x5453	0x242C0
+0x5455	0x242EA
+0x5456	0x242B7
+0x5457	0x242BA
+0x5458	0x242B5
+0x5459	0x2F91D
+0x545A	0x242B4
+0x545B	0x242BC
+0x545C	0x242C6
+0x545D	0x242B8
+0x545E	0x242BD
+0x545F	0x242C2
+0x5460	0x2434D
+0x5461	0x242F0
+0x5462	0x242C7
+0x5463	0x242C1
+0x5464	0x242C3
+0x5465	0x242F1
+0x5466	0x242EC
+0x5468	0x2451C
+0x5469	0x24520
+0x546A	0x24558
+0x546B	0x24565
+0x546C	0x24564
+0x546D	0x2458C
+0x546E	0x2458D
+0x546F	0x245D9
+0x5470	0x245E0
+0x5471	0x24610
+0x5472	0x24694
+0x5473	0x24692
+0x5474	0x24696
+0x5475	0x24695
+0x5476	0x246BF
+0x5477	0x246A0
+0x5479	0x247F4
+0x547A	0x247F6
+0x547B	0x247DC
+0x547D	0x24816
+0x547E	0x24815
+0x5521	0x2481C
+0x5522	0x2480F
+0x5523	0x2482C
+0x5524	0x24814
+0x5525	0x24825
+0x5526	0x24817
+0x5527	0x24812
+0x5528	0x2481E
+0x5529	0x24980
+0x552A	0x249A8
+0x552B	0x249AF
+0x552C	0x249D6
+0x552D	0x249E2
+0x552E	0x249B4
+0x552F	0x249B3
+0x5530	0x249B0
+0x5531	0x249B2
+0x5532	0x249A1
+0x5533	0x24B60
+0x5534	0x24B66
+0x5535	0x24B61
+0x5536	0x24B4E
+0x5537	0x24B5D
+0x5538	0x24B63
+0x5539	0x24BE6
+0x553A	0x24BEF
+0x553B	0x24BEC
+0x553C	0x24C98
+0x553D	0x24CA7
+0x553E	0x24C94
+0x553F	0x24C95
+0x5540	0x24C91
+0x5541	0x24C9D
+0x5542	0x24C99
+0x5543	0x24C9B
+0x5544	0x24C9C
+0x5545	0x24D1D
+0x5546	0x24D1C
+0x5547	0x24DD0
+0x5548	0x24DE0
+0x5549	0x24DCB
+0x554A	0x24DDB
+0x554B	0x24DDA
+0x554C	0x24DC2
+0x554D	0x24DD3
+0x554E	0x24DE5
+0x554F	0x24F7D
+0x5550	0x24F7B
+0x5551	0x24FFF
+0x5553	0x24FF9
+0x5554	0x25077
+0x5555	0x2507C
+0x5556	0x25078
+0x5557	0x2507B
+0x5558	0x2507A
+0x5559	0x251D2
+0x555A	0x251CB
+0x555B	0x251C9
+0x555C	0x251CE
+0x555D	0x251E4
+0x555E	0x251CA
+0x555F	0x251D0
+0x5560	0x22FA5
+0x5562	0x251D9
+0x5563	0x251EE
+0x5564	0x251DD
+0x5565	0x25200
+0x5566	0x251E1
+0x5567	0x253DE
+0x5568	0x253E2
+0x5569	0x253DA
+0x556A	0x254CE
+0x556B	0x2F94F
+0x556C	0x254CF
+0x556D	0x254DA
+0x556E	0x254D1
+0x556F	0x254D4
+0x5570	0x254ED
+0x5571	0x254CB
+0x5572	0x254D5
+0x5573	0x254F1
+0x5574	0x2569C
+0x5575	0x25688
+0x5576	0x25741
+0x5577	0x257D0
+0x5578	0x257F7
+0x5579	0x257CF
+0x557A	0x257D1
+0x557B	0x257DB
+0x557C	0x257DE
+0x557D	0x257F8
+0x557E	0x257DC
+0x5621	0x257D9
+0x5622	0x259A0
+0x5623	0x259B2
+0x5624	0x259A1
+0x5625	0x259AA
+0x5626	0x259A9
+0x5628	0x259A6
+0x5629	0x2599C
+0x562A	0x259B5
+0x562B	0x259A7
+0x562C	0x25A8E
+0x562D	0x25A90
+0x562E	0x25A91
+0x562F	0x25B85
+0x5630	0x25B5B
+0x5631	0x25B70
+0x5632	0x25B64
+0x5633	0x25B67
+0x5634	0x25B63
+0x5635	0x25B77
+0x5636	0x25B68
+0x5637	0x25B65
+0x5638	0x25B6A
+0x5639	0x25B78
+0x563A	0x25B66
+0x563B	0x25E88
+0x563C	0x25E9E
+0x563D	0x25E74
+0x563E	0x25E7A
+0x563F	0x25E79
+0x5640	0x25E8B
+0x5641	0x25E7F
+0x5642	0x26013
+0x5643	0x2601E
+0x5644	0x26017
+0x5645	0x2601A
+0x5646	0x26022
+0x5647	0x26043
+0x5648	0x26019
+0x5649	0x2601F
+0x564A	0x26027
+0x564B	0x26012
+0x564C	0x26024
+0x564D	0x26025
+0x564E	0x2035E
+0x564F	0x26235
+0x5650	0x26234
+0x5651	0x262D1
+0x5652	0x262C4
+0x5653	0x262CA
+0x5654	0x262C6
+0x5655	0x262CB
+0x5656	0x262CD
+0x5657	0x262E2
+0x5658	0x26389
+0x5659	0x2638B
+0x565A	0x26386
+0x565B	0x26388
+0x565C	0x2638D
+0x565D	0x2643B
+0x565E	0x2643C
+0x565F	0x2643D
+0x5660	0x264F5
+0x5661	0x26579
+0x5662	0x26575
+0x5663	0x26582
+0x5664	0x2657F
+0x5665	0x26585
+0x5666	0x26576
+0x5667	0x2657C
+0x5668	0x2657E
+0x5669	0x2657B
+0x566A	0x26580
+0x566B	0x2657A
+0x566C	0x22548
+0x566E	0x2661D
+0x566F	0x266F6
+0x5670	0x266F7
+0x5671	0x266F9
+0x5672	0x26763
+0x5673	0x2676C
+0x5674	0x2676E
+0x5675	0x26714
+0x5677	0x26767
+0x5678	0x2676F
+0x5679	0x26769
+0x567A	0x26776
+0x567B	0x26795
+0x567C	0x26771
+0x567D	0x26761
+0x567E	0x26778
+0x5721	0x2676B
+0x5722	0x26785
+0x5723	0x26784
+0x5724	0x26914
+0x5725	0x26976
+0x5726	0x259B6
+0x5727	0x26975
+0x5728	0x26974
+0x5729	0x269E2
+0x572A	0x26A3F
+0x572B	0x26A44
+0x572C	0x26A3D
+0x572D	0x26A47
+0x572E	0x26A48
+0x572F	0x26ADB
+0x5730	0x26ADC
+0x5731	0x26ADD
+0x5732	0x26BE5
+0x5733	0x26BE6
+0x5734	0x26CC2
+0x5735	0x26D2E
+0x5736	0x26D1D
+0x5737	0x26CF8
+0x5738	0x26CF0
+0x5739	0x26CF6
+0x573A	0x26CC5
+0x573B	0x26CC6
+0x573C	0x26CFC
+0x573D	0x26D52
+0x573E	0x26D2F
+0x573F	0x26D10
+0x5740	0x26CF3
+0x5741	0x26CD2
+0x5742	0x26CEA
+0x5743	0x26CDC
+0x5744	0x26D1B
+0x5745	0x26CFB
+0x5746	0x26CC3
+0x5747	0x26D16
+0x5748	0x26D07
+0x5749	0x26CC9
+0x574A	0x26CD8
+0x574B	0x26D30
+0x574C	0x26D13
+0x574D	0x26D31
+0x574E	0x26CFA
+0x574F	0x26CF2
+0x5750	0x26DE3
+0x5751	0x26CD5
+0x5752	0x26D01
+0x5753	0x26CF1
+0x5754	0x26D1C
+0x5755	0x26CD6
+0x5756	0x26D08
+0x5757	0x26D0B
+0x5758	0x26D17
+0x5759	0x26D20
+0x575A	0x26CCA
+0x575B	0x26D32
+0x575C	0x26D05
+0x575D	0x26CE4
+0x575E	0x26CCE
+0x575F	0x26D33
+0x5760	0x26D02
+0x5761	0x26D19
+0x5762	0x26D1E
+0x5763	0x26CD3
+0x5764	0x26CF7
+0x5765	0x26CE8
+0x5766	0x26D1F
+0x5767	0x26CF4
+0x5768	0x26DD8
+0x5769	0x271BF
+0x576A	0x271BE
+0x576B	0x271BD
+0x576C	0x272DC
+0x576D	0x272DD
+0x576E	0x272AB
+0x576F	0x272C9
+0x5770	0x272C8
+0x5771	0x272DF
+0x5772	0x272D9
+0x5773	0x272DB
+0x5774	0x272CC
+0x5775	0x272E0
+0x5776	0x272EF
+0x5777	0x272F3
+0x5778	0x272AE
+0x5779	0x27301
+0x577A	0x275B7
+0x577B	0x275B9
+0x577C	0x275B6
+0x577D	0x275B8
+0x577E	0x275F6
+0x5821	0x275F3
+0x5822	0x275F5
+0x5823	0x275F2
+0x5824	0x27691
+0x5825	0x2769D
+0x5826	0x2769B
+0x5827	0x27692
+0x5828	0x2768D
+0x5829	0x2769E
+0x582A	0x2768C
+0x582C	0x2F9C7
+0x582D	0x27695
+0x582E	0x2F9C6
+0x582F	0x2768A
+0x5830	0x2768E
+0x5831	0x2769C
+0x5832	0x277EF
+0x5833	0x2782D
+0x5834	0x27852
+0x5835	0x27835
+0x5836	0x27828
+0x5837	0x2782E
+0x5838	0x278E5
+0x5839	0x279EA
+0x583A	0x279F1
+0x583B	0x279EB
+0x583C	0x279D8
+0x583D	0x279D0
+0x583E	0x279F3
+0x583F	0x279DB
+0x5840	0x279CE
+0x5842	0x279DA
+0x5843	0x279D7
+0x5844	0x279E1
+0x5845	0x279F2
+0x5846	0x279C8
+0x5847	0x279D9
+0x5848	0x279DE
+0x5849	0x279D1
+0x584A	0x279E7
+0x584B	0x279CF
+0x584C	0x27BB7
+0x584D	0x27C47
+0x584E	0x27C42
+0x584F	0x27C43
+0x5850	0x2F9D3
+0x5851	0x27CC3
+0x5852	0x27CC1
+0x5853	0x27CC7
+0x5854	0x27D64
+0x5855	0x27D6A
+0x5856	0x27D66
+0x5857	0x27D50
+0x5858	0x27D6E
+0x5859	0x27D65
+0x585A	0x238EC
+0x585B	0x27D7F
+0x585C	0x2F9D5
+0x585D	0x27D9A
+0x585E	0x27D69
+0x585F	0x27D72
+0x5860	0x27D6F
+0x5861	0x27D7D
+0x5862	0x27D70
+0x5863	0x27E60
+0x5864	0x27EC2
+0x5865	0x27EE7
+0x5866	0x27ED1
+0x5867	0x27EEB
+0x5868	0x27ED4
+0x5869	0x27EDC
+0x586A	0x27EDB
+0x586B	0x28037
+0x586C	0x28025
+0x586D	0x2801F
+0x586E	0x2801E
+0x586F	0x28021
+0x5870	0x2801B
+0x5871	0x28017
+0x5872	0x28022
+0x5873	0x2802A
+0x5874	0x2801A
+0x5875	0x2802D
+0x5876	0x28023
+0x5877	0x28026
+0x5878	0x28036
+0x5879	0x27FFF
+0x587A	0x2823A
+0x587B	0x28240
+0x587C	0x28242
+0x587D	0x28238
+0x587E	0x2823B
+0x5921	0x2823C
+0x5922	0x28243
+0x5923	0x282E8
+0x5925	0x282F9
+0x5926	0x282EB
+0x5927	0x282F1
+0x5928	0x282E9
+0x5929	0x282EC
+0x592A	0x28415
+0x592B	0x28447
+0x592C	0x28446
+0x592D	0x28445
+0x592E	0x28524
+0x592F	0x28556
+0x5930	0x28521
+0x5931	0x28527
+0x5932	0x2854D
+0x5933	0x28531
+0x5934	0x2851E
+0x5935	0x2852C
+0x5936	0x2854F
+0x5937	0x2852B
+0x5938	0x28553
+0x5939	0x28551
+0x593A	0x28554
+0x593B	0x28529
+0x593C	0x28550
+0x593D	0x2851F
+0x593E	0x28532
+0x593F	0x2852A
+0x5940	0x2851D
+0x5941	0x28528
+0x5942	0x2852E
+0x5943	0x2852D
+0x5944	0x286BC
+0x5945	0x286BB
+0x5946	0x286BD
+0x5947	0x2F9E4
+0x5948	0x28747
+0x5949	0x28741
+0x594A	0x2F9E5
+0x594B	0x28749
+0x594D	0x2882E
+0x594E	0x28827
+0x594F	0x2896A
+0x5950	0x2897B
+0x5951	0x28973
+0x5952	0x28975
+0x5953	0x28969
+0x5954	0x28979
+0x5955	0x28972
+0x5956	0x28C76
+0x5957	0x28C77
+0x5958	0x28C74
+0x5959	0x28C73
+0x595A	0x28D02
+0x595B	0x28CFE
+0x595C	0x28D01
+0x595D	0x28CF9
+0x595E	0x28CF4
+0x595F	0x28ED3
+0x5960	0x28ED5
+0x5961	0x28ED8
+0x5962	0x28EC3
+0x5963	0x28ECA
+0x5964	0x28ED0
+0x5965	0x28ECB
+0x5966	0x28ECE
+0x5967	0x28EC5
+0x5968	0x28EE6
+0x5969	0x28EC4
+0x596A	0x28EC0
+0x596B	0x28ED4
+0x596C	0x28EE8
+0x596D	0x28F76
+0x596E	0x28FA2
+0x596F	0x28FAE
+0x5970	0x28FA8
+0x5971	0x28FA3
+0x5972	0x28FA7
+0x5973	0x28F96
+0x5974	0x28FA9
+0x5975	0x28FA5
+0x5976	0x28FAF
+0x5977	0x28FA4
+0x5978	0x28FAB
+0x5979	0x28FAA
+0x597A	0x28FA6
+0x597B	0x28FA0
+0x597C	0x29098
+0x597D	0x291DB
+0x597E	0x291F6
+0x5A21	0x291F5
+0x5A22	0x2920C
+0x5A23	0x2920A
+0x5A25	0x29268
+0x5A26	0x29263
+0x5A27	0x29266
+0x5A29	0x29264
+0x5A2A	0x2926A
+0x5A2B	0x29269
+0x5A2C	0x29395
+0x5A2D	0x29402
+0x5A2E	0x2946A
+0x5A2F	0x2945E
+0x5A30	0x29468
+0x5A31	0x29469
+0x5A32	0x29465
+0x5A33	0x2F9FE
+0x5A34	0x295A7
+0x5A35	0x295AE
+0x5A36	0x295A8
+0x5A37	0x295B3
+0x5A38	0x2969C
+0x5A39	0x296A9
+0x5A3A	0x296B6
+0x5A3B	0x296B3
+0x5A3C	0x296B2
+0x5A3D	0x2FA03
+0x5A3E	0x296B8
+0x5A3F	0x296C0
+0x5A40	0x296BF
+0x5A41	0x296BA
+0x5A42	0x296A8
+0x5A43	0x2983C
+0x5A44	0x29872
+0x5A45	0x29871
+0x5A46	0x29875
+0x5A47	0x29873
+0x5A48	0x29A17
+0x5A49	0x29A15
+0x5A4A	0x29A16
+0x5A4B	0x29A1B
+0x5A4C	0x29AFA
+0x5A4D	0x29AF9
+0x5A4E	0x29C2C
+0x5A4F	0x29C85
+0x5A50	0x29C82
+0x5A51	0x29C7F
+0x5A52	0x29C7D
+0x5A53	0x29C88
+0x5A54	0x242F3
+0x5A55	0x29D4E
+0x5A56	0x29D50
+0x5A57	0x29F93
+0x5A58	0x29F97
+0x5A59	0x29F98
+0x5A5A	0x29F9B
+0x5A5B	0x29F9C
+0x5A5C	0x29F96
+0x5A5D	0x2A28B
+0x5A5E	0x2A2FD
+0x5A5F	0x2A2FC
+0x5A60	0x2FA17
+0x5A61	0x2398B
+0x5A62	0x20108
+0x5A63	0x20107
+0x5A64	0x20373
+0x5A65	0x203A2
+0x5A66	0x203AF
+0x5A67	0x20382
+0x5A68	0x2037B
+0x5A69	0x20374
+0x5A6A	0x203B0
+0x5A6B	0x20376
+0x5A6C	0x203B9
+0x5A6D	0x2039E
+0x5A6E	0x203B1
+0x5A6F	0x203A1
+0x5A70	0x203B2
+0x5A71	0x2036E
+0x5A72	0x2F80B
+0x5A74	0x20378
+0x5A75	0x2037A
+0x5A76	0x20383
+0x5A77	0x2039A
+0x5A78	0x204F8
+0x5A79	0x20531
+0x5A7A	0x20569
+0x5A7B	0x20568
+0x5A7C	0x2059C
+0x5A7D	0x20604
+0x5A7E	0x20699
+0x5B21	0x207C7
+0x5B22	0x207C6
+0x5B23	0x207DC
+0x5B24	0x207C4
+0x5B25	0x207D8
+0x5B26	0x207D4
+0x5B27	0x207DF
+0x5B28	0x207D1
+0x5B29	0x207D0
+0x5B2A	0x207D6
+0x5B2B	0x207CF
+0x5B2C	0x208AD
+0x5B2D	0x208AF
+0x5B2E	0x208A7
+0x5B2F	0x208FD
+0x5B30	0x2095B
+0x5B31	0x2095A
+0x5B32	0x20A07
+0x5B33	0x20A9D
+0x5B34	0x20A9B
+0x5B35	0x20AAB
+0x5B36	0x20AA4
+0x5B37	0x20A9C
+0x5B38	0x20A9E
+0x5B39	0x20AA5
+0x5B3A	0x20AAA
+0x5B3B	0x20AA6
+0x5B3C	0x20B0E
+0x5B3D	0x20B7E
+0x5B3E	0x20B7C
+0x5B3F	0x20EEE
+0x5B40	0x20ED5
+0x5B41	0x20EE9
+0x5B42	0x20E42
+0x5B43	0x20EE2
+0x5B44	0x20F23
+0x5B45	0x20ED9
+0x5B46	0x20ED4
+0x5B47	0x20EE3
+0x5B48	0x20F15
+0x5B49	0x20EEF
+0x5B4A	0x20EF0
+0x5B4B	0x20ED6
+0x5B4C	0x20EDD
+0x5B4D	0x20EF6
+0x5B4E	0x20F1C
+0x5B4F	0x20ED8
+0x5B50	0x20EDB
+0x5B51	0x20EDA
+0x5B52	0x20EED
+0x5B53	0x21411
+0x5B54	0x21215
+0x5B55	0x21218
+0x5B56	0x2121A
+0x5B57	0x2121F
+0x5B58	0x21216
+0x5B59	0x2F84D
+0x5B5A	0x21219
+0x5B5B	0x2F84B
+0x5B5C	0x213F0
+0x5B5D	0x21409
+0x5B5E	0x2141B
+0x5B5F	0x27BE7
+0x5B60	0x213F6
+0x5B61	0x213F4
+0x5B62	0x213B5
+0x5B63	0x21410
+0x5B64	0x213F2
+0x5B65	0x21415
+0x5B66	0x213F3
+0x5B67	0x213F8
+0x5B68	0x21539
+0x5B69	0x2153B
+0x5B6A	0x21536
+0x5B6B	0x2140E
+0x5B6C	0x21572
+0x5B6D	0x21574
+0x5B6E	0x215B9
+0x5B6F	0x215B7
+0x5B70	0x215B8
+0x5B71	0x21672
+0x5B72	0x2166B
+0x5B73	0x2181D
+0x5B74	0x21837
+0x5B75	0x21822
+0x5B76	0x21843
+0x5B77	0x2184D
+0x5B78	0x21838
+0x5B79	0x2185B
+0x5B7A	0x21879
+0x5B7B	0x2181B
+0x5B7C	0x217F3
+0x5B7D	0x21991
+0x5B7E	0x21A7B
+0x5C21	0x21A94
+0x5C22	0x2F86F
+0x5C23	0x21A96
+0x5C24	0x21A7F
+0x5C25	0x21A8F
+0x5C26	0x21A84
+0x5C27	0x21A7C
+0x5C28	0x21A8E
+0x5C29	0x21A90
+0x5C2A	0x21A98
+0x5C2B	0x21A83
+0x5C2C	0x21A80
+0x5C2D	0x21A93
+0x5C2E	0x21A82
+0x5C30	0x21B3D
+0x5C31	0x21B41
+0x5C32	0x21BA1
+0x5C33	0x21B9F
+0x5C34	0x21C0A
+0x5C35	0x21C0D
+0x5C36	0x21CC8
+0x5C37	0x21CC9
+0x5C38	0x21CC7
+0x5C39	0x21CCD
+0x5C3A	0x21D25
+0x5C3B	0x21EB1
+0x5C3C	0x21EDC
+0x5C3D	0x2F880
+0x5C3E	0x21EE5
+0x5C3F	0x21EF4
+0x5C40	0x21EBF
+0x5C41	0x21EDB
+0x5C42	0x21EEA
+0x5C43	0x21EF2
+0x5C45	0x21EF1
+0x5C46	0x21EED
+0x5C47	0x21EE6
+0x5C48	0x22002
+0x5C49	0x2F882
+0x5C4A	0x22125
+0x5C4B	0x22118
+0x5C4C	0x2211F
+0x5C4D	0x22120
+0x5C4E	0x221CF
+0x5C4F	0x2229D
+0x5C50	0x22299
+0x5C51	0x222A8
+0x5C52	0x22368
+0x5C53	0x22366
+0x5C54	0x22367
+0x5C55	0x22391
+0x5C56	0x22413
+0x5C57	0x22415
+0x5C58	0x2241D
+0x5C59	0x22416
+0x5C5A	0x22419
+0x5C5B	0x2246B
+0x5C5C	0x22468
+0x5C5D	0x2246A
+0x5C5E	0x2246D
+0x5C5F	0x22469
+0x5C60	0x224AA
+0x5C61	0x22557
+0x5C62	0x22552
+0x5C63	0x22550
+0x5C64	0x2255F
+0x5C65	0x22567
+0x5C66	0x2254F
+0x5C68	0x2255B
+0x5C69	0x2255C
+0x5C6A	0x2255D
+0x5C6B	0x2281F
+0x5C6C	0x2279D
+0x5C6D	0x227B1
+0x5C6E	0x227B0
+0x5C6F	0x22794
+0x5C70	0x227C3
+0x5C71	0x227AF
+0x5C72	0x227A8
+0x5C73	0x227DC
+0x5C74	0x22798
+0x5C75	0x227C4
+0x5C76	0x227A4
+0x5C77	0x227AB
+0x5C78	0x227AA
+0x5C79	0x227A5
+0x5C7A	0x22821
+0x5C7B	0x227EB
+0x5C7C	0x227E6
+0x5C7D	0x227F7
+0x5C7E	0x227F8
+0x5D21	0x227FC
+0x5D22	0x227FA
+0x5D23	0x227E0
+0x5D24	0x2F8AA
+0x5D25	0x227F6
+0x5D26	0x2F8A9
+0x5D27	0x227E1
+0x5D28	0x229EC
+0x5D29	0x229E2
+0x5D2A	0x229E4
+0x5D2B	0x229F9
+0x5D2C	0x22C6F
+0x5D2D	0x23A4C
+0x5D2E	0x22CBB
+0x5D2F	0x22CE1
+0x5D30	0x22D00
+0x5D31	0x22CD8
+0x5D33	0x22CD6
+0x5D34	0x22CE2
+0x5D35	0x22CC3
+0x5D36	0x22CB3
+0x5D37	0x22CD2
+0x5D38	0x2F8C1
+0x5D39	0x22CCE
+0x5D3A	0x22CD0
+0x5D3B	0x22CD5
+0x5D3C	0x22CB9
+0x5D3D	0x22CBA
+0x5D3E	0x22CCF
+0x5D3F	0x22CBD
+0x5D40	0x22EDB
+0x5D41	0x22FAA
+0x5D42	0x22FAD
+0x5D43	0x22FB8
+0x5D44	0x22FB6
+0x5D45	0x22FB5
+0x5D46	0x22FAF
+0x5D47	0x22FB4
+0x5D48	0x22FB7
+0x5D49	0x22FA8
+0x5D4A	0x22FB9
+0x5D4B	0x22FBE
+0x5D4C	0x23082
+0x5D4D	0x230BC
+0x5D4E	0x230B8
+0x5D4F	0x230B6
+0x5D50	0x230B9
+0x5D52	0x23110
+0x5D53	0x23227
+0x5D54	0x23269
+0x5D55	0x23270
+0x5D56	0x23256
+0x5D57	0x2326B
+0x5D58	0x2327A
+0x5D59	0x2326C
+0x5D5A	0x2326D
+0x5D5B	0x2F8D5
+0x5D5C	0x267C1
+0x5D5D	0x2338D
+0x5D5E	0x23390
+0x5D5F	0x235B6
+0x5D60	0x23610
+0x5D61	0x23612
+0x5D62	0x235BA
+0x5D63	0x235BD
+0x5D64	0x23605
+0x5D65	0x235C2
+0x5D66	0x23607
+0x5D67	0x235F5
+0x5D68	0x2F8E9
+0x5D69	0x235AF
+0x5D6A	0x235F4
+0x5D6B	0x235F7
+0x5D6C	0x235F8
+0x5D6D	0x23611
+0x5D6E	0x238F6
+0x5D6F	0x238F5
+0x5D70	0x238FB
+0x5D71	0x23901
+0x5D72	0x23900
+0x5D73	0x23902
+0x5D74	0x238FE
+0x5D75	0x238FA
+0x5D76	0x238FD
+0x5D78	0x23A37
+0x5D79	0x23A49
+0x5D7A	0x23A4B
+0x5D7B	0x23A46
+0x5D7C	0x23A47
+0x5D7D	0x23AB3
+0x5D7E	0x23AB2
+0x5E21	0x23AB0
+0x5E22	0x23AB7
+0x5E23	0x23B11
+0x5E24	0x23BCC
+0x5E25	0x23BDF
+0x5E26	0x23BD3
+0x5E27	0x23BD5
+0x5E28	0x23BDB
+0x5E29	0x23BC5
+0x5E2A	0x23BC8
+0x5E2B	0x23BC9
+0x5E2C	0x23BE2
+0x5E2D	0x23BCA
+0x5E2E	0x23BD1
+0x5E2F	0x23BD2
+0x5E30	0x23BDD
+0x5E31	0x23E6C
+0x5E32	0x23E73
+0x5E33	0x23F21
+0x5E34	0x23EF0
+0x5E35	0x23F1F
+0x5E36	0x23F3B
+0x5E37	0x23F22
+0x5E38	0x23F23
+0x5E39	0x23EE8
+0x5E3A	0x23EDD
+0x5E3C	0x23F1B
+0x5E3D	0x23EED
+0x5E3E	0x2F90E
+0x5E3F	0x23EF2
+0x5E41	0x23EDC
+0x5E42	0x23EE9
+0x5E43	0x23F1D
+0x5E44	0x23EDA
+0x5E45	0x23EE6
+0x5E46	0x24313
+0x5E47	0x24315
+0x5E48	0x24316
+0x5E49	0x2433C
+0x5E4A	0x2430B
+0x5E4B	0x2431C
+0x5E4C	0x2433A
+0x5E4D	0x2433D
+0x5E4E	0x2439A
+0x5E4F	0x2431D
+0x5E50	0x24309
+0x5E51	0x24308
+0x5E52	0x2433B
+0x5E53	0x24522
+0x5E54	0x24526
+0x5E55	0x24525
+0x5E56	0x24524
+0x5E57	0x2039B
+0x5E58	0x2458F
+0x5E59	0x24590
+0x5E5A	0x245E6
+0x5E5B	0x245E3
+0x5E5C	0x245E5
+0x5E5D	0x24611
+0x5E5E	0x2F925
+0x5E5F	0x246AE
+0x5E60	0x246BE
+0x5E61	0x246B4
+0x5E62	0x246B3
+0x5E63	0x246AF
+0x5E64	0x24691
+0x5E65	0x246C2
+0x5E66	0x246B6
+0x5E67	0x246B2
+0x5E68	0x24857
+0x5E69	0x2483B
+0x5E6A	0x24858
+0x5E6B	0x24851
+0x5E6C	0x24841
+0x5E6D	0x24839
+0x5E6F	0x24859
+0x5E70	0x24845
+0x5E71	0x24861
+0x5E72	0x248E8
+0x5E73	0x249FA
+0x5E74	0x249EA
+0x5E75	0x249EF
+0x5E76	0x249F2
+0x5E77	0x249F0
+0x5E78	0x24B08
+0x5E79	0x24B70
+0x5E7A	0x24B6A
+0x5E7B	0x24B73
+0x5E7C	0x24B68
+0x5E7D	0x24BC8
+0x5E7E	0x24BF2
+0x5F21	0x20B7B
+0x5F22	0x24CAE
+0x5F23	0x24CAB
+0x5F24	0x24CB5
+0x5F25	0x24CAF
+0x5F26	0x24CB2
+0x5F27	0x24CB6
+0x5F28	0x24CB0
+0x5F29	0x24D1E
+0x5F2A	0x24E03
+0x5F2B	0x24E06
+0x5F2C	0x24E1F
+0x5F2E	0x24E0F
+0x5F2F	0x24E02
+0x5F30	0x24E19
+0x5F31	0x24E18
+0x5F32	0x24E22
+0x5F33	0x24E15
+0x5F34	0x24E07
+0x5F35	0x24E0D
+0x5F36	0x24E24
+0x5F37	0x24E0C
+0x5F38	0x24E1E
+0x5F39	0x24F89
+0x5F3A	0x24F8A
+0x5F3B	0x2500A
+0x5F3C	0x2500B
+0x5F3D	0x25007
+0x5F3E	0x25004
+0x5F3F	0x25009
+0x5F40	0x25084
+0x5F41	0x25083
+0x5F42	0x25218
+0x5F43	0x25214
+0x5F44	0x25205
+0x5F45	0x25216
+0x5F46	0x2520E
+0x5F47	0x25211
+0x5F48	0x25208
+0x5F49	0x2520B
+0x5F4A	0x25215
+0x5F4B	0x25085
+0x5F4C	0x25237
+0x5F4D	0x2522A
+0x5F4E	0x2520D
+0x5F4F	0x2520F
+0x5F50	0x2537E
+0x5F51	0x25376
+0x5F52	0x25377
+0x5F53	0x253EC
+0x5F54	0x254FC
+0x5F55	0x25508
+0x5F56	0x254FF
+0x5F57	0x25503
+0x5F58	0x25510
+0x5F59	0x25505
+0x5F5A	0x25506
+0x5F5B	0x254FA
+0x5F5C	0x256C7
+0x5F5D	0x256C0
+0x5F5E	0x256C3
+0x5F5F	0x256A7
+0x5F60	0x256A8
+0x5F61	0x256AB
+0x5F62	0x256C1
+0x5F63	0x256AA
+0x5F64	0x256C8
+0x5F65	0x25743
+0x5F66	0x25802
+0x5F67	0x2580E
+0x5F68	0x25801
+0x5F69	0x257FE
+0x5F6A	0x25803
+0x5F6C	0x25822
+0x5F6D	0x25821
+0x5F6E	0x25807
+0x5F6F	0x25808
+0x5F70	0x2580C
+0x5F71	0x259CA
+0x5F72	0x259BC
+0x5F73	0x259BE
+0x5F74	0x259BD
+0x5F75	0x2F95C
+0x5F76	0x259BB
+0x5F77	0x259B9
+0x5F79	0x259C5
+0x5F7A	0x25A99
+0x5F7B	0x25B6B
+0x5F7C	0x25B93
+0x5F7D	0x25B94
+0x5F7E	0x25BA9
+0x6021	0x25BA0
+0x6022	0x25BA6
+0x6023	0x2F961
+0x6024	0x25BAB
+0x6025	0x25B9E
+0x6026	0x25B9B
+0x6027	0x25B91
+0x6028	0x25B99
+0x6029	0x25EB6
+0x602A	0x25EB8
+0x602B	0x25E9A
+0x602D	0x25E98
+0x602E	0x25E9B
+0x602F	0x25EB3
+0x6030	0x25EA2
+0x6031	0x222AA
+0x6032	0x25EA0
+0x6033	0x25E9F
+0x6034	0x2605B
+0x6035	0x26070
+0x6036	0x26054
+0x6037	0x26071
+0x6038	0x26065
+0x6039	0x26051
+0x603A	0x2609D
+0x603B	0x26061
+0x603C	0x2605A
+0x603D	0x26074
+0x603E	0x2604C
+0x603F	0x2604B
+0x6040	0x2605E
+0x6041	0x26058
+0x6042	0x26053
+0x6043	0x26052
+0x6044	0x2623B
+0x6045	0x26239
+0x6046	0x262D6
+0x6047	0x262E7
+0x6048	0x262D7
+0x6049	0x262D8
+0x604A	0x262D9
+0x604B	0x262DA
+0x604C	0x262DB
+0x604D	0x262DC
+0x604E	0x262E0
+0x604F	0x262E4
+0x6050	0x262DD
+0x6051	0x262F5
+0x6052	0x262F1
+0x6053	0x26398
+0x6054	0x2639D
+0x6055	0x26399
+0x6056	0x26450
+0x6057	0x26449
+0x6059	0x26462
+0x605A	0x264D7
+0x605B	0x26501
+0x605C	0x264F7
+0x605D	0x2F97D
+0x605E	0x2658C
+0x605F	0x2659C
+0x6061	0x2661F
+0x6062	0x2661E
+0x6063	0x2673D
+0x6064	0x2673F
+0x6065	0x26711
+0x6066	0x26759
+0x6067	0x2673E
+0x6068	0x26758
+0x6069	0x26800
+0x606A	0x2679E
+0x606B	0x267B6
+0x606C	0x267AA
+0x606D	0x267AF
+0x606E	0x267AC
+0x6070	0x267C0
+0x6071	0x267A9
+0x6072	0x20B10
+0x6073	0x268EE
+0x6074	0x26977
+0x6075	0x26979
+0x6076	0x2697A
+0x6077	0x2697D
+0x6078	0x2697F
+0x6079	0x26983
+0x607A	0x26978
+0x607B	0x2697E
+0x607C	0x269E4
+0x607D	0x269E6
+0x607E	0x269E5
+0x6122	0x26A4E
+0x6123	0x26A59
+0x6125	0x2F98E
+0x6126	0x26A4F
+0x6127	0x26A4A
+0x6128	0x26AE3
+0x6129	0x26ADE
+0x612A	0x26AE2
+0x612B	0x26C74
+0x612C	0x26CAC
+0x612D	0x26C61
+0x612E	0x26C62
+0x612F	0x26C76
+0x6130	0x26C7A
+0x6131	0x26C79
+0x6132	0x26C60
+0x6133	0x26D64
+0x6134	0x26E81
+0x6135	0x26DDF
+0x6136	0x26D84
+0x6137	0x26D8A
+0x6138	0x26D92
+0x6139	0x26D79
+0x613A	0x26DDE
+0x613B	0x26D98
+0x613C	0x26D6C
+0x613D	0x26DE1
+0x613E	0x2F9A5
+0x613F	0x26D7C
+0x6140	0x26D72
+0x6141	0x26D81
+0x6142	0x26DE0
+0x6143	0x26D65
+0x6145	0x26D6A
+0x6146	0x26D97
+0x6147	0x26DAA
+0x6148	0x26DD3
+0x6149	0x26DAB
+0x614A	0x26D6E
+0x614B	0x26DAC
+0x614C	0x26D76
+0x614D	0x26D7B
+0x614E	0x26DAD
+0x614F	0x2F9A6
+0x6150	0x26D94
+0x6151	0x26DD7
+0x6152	0x26D70
+0x6153	0x26DD5
+0x6154	0x26DF1
+0x6155	0x26D7A
+0x6156	0x26D68
+0x6157	0x26D96
+0x6159	0x26D73
+0x615A	0x26DAE
+0x615B	0x26DDD
+0x615C	0x26DDA
+0x615D	0x26DAF
+0x615E	0x26DB0
+0x615F	0x26DDB
+0x6160	0x26D62
+0x6161	0x26DF8
+0x6162	0x271C2
+0x6163	0x271C7
+0x6164	0x271C8
+0x6165	0x271C5
+0x6166	0x271C3
+0x6167	0x271C6
+0x6168	0x272DE
+0x616A	0x27311
+0x616B	0x27315
+0x616C	0x27328
+0x616D	0x27321
+0x616E	0x2732D
+0x616F	0x27351
+0x6170	0x2732B
+0x6171	0x27316
+0x6172	0x27324
+0x6173	0x27335
+0x6174	0x2731F
+0x6175	0x27312
+0x6176	0x27310
+0x6177	0x27380
+0x6178	0x2733B
+0x6179	0x27329
+0x617A	0x2732A
+0x617B	0x2731B
+0x617C	0x27318
+0x617D	0x27320
+0x617E	0x2733F
+0x6221	0x2731C
+0x6222	0x27326
+0x6223	0x2730B
+0x6224	0x275BE
+0x6225	0x275C4
+0x6226	0x275BD
+0x6227	0x275FA
+0x6228	0x275FB
+0x6229	0x276B1
+0x622A	0x276B2
+0x622B	0x276B0
+0x622C	0x276B9
+0x622D	0x276A6
+0x622E	0x276BD
+0x622F	0x276B6
+0x6230	0x276B8
+0x6231	0x276B4
+0x6232	0x276B3
+0x6233	0x276A7
+0x6234	0x276AE
+0x6235	0x276BC
+0x6236	0x277F2
+0x6237	0x277F3
+0x6238	0x277F4
+0x6239	0x2783B
+0x623A	0x27840
+0x623B	0x27846
+0x623C	0x278F0
+0x623D	0x278EE
+0x623E	0x278E8
+0x623F	0x278F1
+0x6240	0x278EB
+0x6241	0x278EF
+0x6242	0x279FC
+0x6243	0x27A20
+0x6244	0x27A09
+0x6245	0x27A06
+0x6246	0x27A03
+0x6247	0x2F9CF
+0x6248	0x27A19
+0x6249	0x27A24
+0x624A	0x27A1B
+0x624B	0x27A1D
+0x624C	0x279FD
+0x624D	0x27A1E
+0x624E	0x279F4
+0x624F	0x27A01
+0x6250	0x27A08
+0x6251	0x27A05
+0x6252	0x27A23
+0x6253	0x279FF
+0x6254	0x27BEA
+0x6255	0x27C4D
+0x6256	0x27C4E
+0x6257	0x27C56
+0x6258	0x27C57
+0x6259	0x27C51
+0x625A	0x27C55
+0x625B	0x27C54
+0x625C	0x27CCB
+0x625D	0x27CD4
+0x625E	0x27CD1
+0x625F	0x27CCF
+0x6260	0x27CD2
+0x6261	0x27CCA
+0x6262	0x27CD6
+0x6263	0x27D8B
+0x6264	0x27D88
+0x6265	0x27D85
+0x6266	0x27D89
+0x6267	0x21A9B
+0x6268	0x27DBB
+0x6269	0x27D8C
+0x626B	0x27D99
+0x626C	0x27D8A
+0x626D	0x27EEC
+0x626E	0x27EEF
+0x626F	0x27EF9
+0x6270	0x27F09
+0x6271	0x27EF8
+0x6272	0x27EF3
+0x6273	0x27F00
+0x6274	0x27F1D
+0x6276	0x27EFD
+0x6277	0x28048
+0x6278	0x2805C
+0x6279	0x28055
+0x627A	0x2805E
+0x627B	0x28049
+0x627C	0x28063
+0x627D	0x28060
+0x627E	0x28053
+0x6321	0x28062
+0x6322	0x28040
+0x6323	0x28249
+0x6324	0x2824A
+0x6325	0x2824C
+0x6326	0x2824D
+0x6327	0x2830A
+0x6328	0x28306
+0x6329	0x2832F
+0x632A	0x28321
+0x632B	0x28307
+0x632C	0x28309
+0x632D	0x28302
+0x632E	0x28316
+0x632F	0x28303
+0x6330	0x2830B
+0x6331	0x2830F
+0x6332	0x28560
+0x6333	0x28568
+0x6334	0x2855E
+0x6335	0x2855D
+0x6336	0x28563
+0x6337	0x2855F
+0x6338	0x28564
+0x6339	0x28578
+0x633A	0x28561
+0x633B	0x28569
+0x633C	0x28565
+0x633D	0x286DA
+0x633E	0x286E6
+0x633F	0x286DB
+0x6340	0x286DC
+0x6341	0x28739
+0x6342	0x28757
+0x6343	0x28755
+0x6344	0x28765
+0x6345	0x28761
+0x6346	0x28754
+0x6347	0x28845
+0x6348	0x28841
+0x6349	0x2883E
+0x634A	0x28837
+0x634B	0x28912
+0x634C	0x28913
+0x634D	0x2892C
+0x634E	0x28996
+0x634F	0x2F9E9
+0x6350	0x2899C
+0x6351	0x2899D
+0x6352	0x28985
+0x6353	0x2F9E8
+0x6354	0x2899F
+0x6355	0x289A3
+0x6356	0x28C82
+0x6357	0x28C83
+0x6358	0x2F9EE
+0x6359	0x28D1D
+0x635A	0x28D14
+0x635B	0x28D1F
+0x635C	0x28D20
+0x635D	0x28E47
+0x635E	0x28E80
+0x635F	0x28EC9
+0x6360	0x28EF9
+0x6361	0x28F06
+0x6362	0x28EF0
+0x6363	0x28EF8
+0x6364	0x28EEF
+0x6365	0x28EFD
+0x6366	0x28EF1
+0x6367	0x28EFE
+0x6368	0x28FB8
+0x6369	0x28FC0
+0x636A	0x28FC3
+0x636B	0x28FB5
+0x636C	0x28FB6
+0x636D	0x28FC9
+0x636E	0x2F9F3
+0x636F	0x28FBD
+0x6370	0x28FBA
+0x6371	0x28FBF
+0x6372	0x28FB3
+0x6373	0x28FC6
+0x6374	0x28FB2
+0x6375	0x28FBC
+0x6376	0x28FB7
+0x6377	0x28FB9
+0x6378	0x28FC8
+0x6379	0x290B5
+0x637A	0x290B3
+0x637C	0x290AC
+0x637D	0x290A9
+0x637E	0x290AD
+0x6421	0x29211
+0x6422	0x2920D
+0x6423	0x29216
+0x6424	0x29289
+0x6425	0x2927C
+0x6426	0x2928B
+0x6427	0x2927B
+0x6428	0x29288
+0x6429	0x29284
+0x642A	0x2939D
+0x642B	0x29398
+0x642C	0x29488
+0x642D	0x29486
+0x642E	0x29482
+0x642F	0x2948B
+0x6430	0x2F9FF
+0x6431	0x29471
+0x6432	0x29472
+0x6433	0x29481
+0x6434	0x2948C
+0x6435	0x29480
+0x6436	0x29489
+0x6437	0x295BB
+0x6438	0x295C1
+0x6439	0x295BE
+0x643A	0x2FA01
+0x643B	0x295BD
+0x643C	0x296C1
+0x643D	0x296B4
+0x643E	0x296B7
+0x643F	0x296C8
+0x6441	0x296D3
+0x6442	0x296D0
+0x6443	0x296B0
+0x6444	0x296CA
+0x6445	0x296CD
+0x6446	0x29815
+0x6447	0x29819
+0x6448	0x29817
+0x6449	0x2983F
+0x644A	0x29840
+0x644B	0x29844
+0x644C	0x2987C
+0x644D	0x29878
+0x644E	0x29879
+0x644F	0x29888
+0x6450	0x2FA06
+0x6451	0x29889
+0x6452	0x2987D
+0x6453	0x29A23
+0x6454	0x29A24
+0x6455	0x29A26
+0x6456	0x29A22
+0x6457	0x29A27
+0x6458	0x29A1F
+0x6459	0x29AC9
+0x645A	0x29AC3
+0x645B	0x29B0A
+0x645C	0x29B0B
+0x645D	0x29B04
+0x645F	0x29B03
+0x6460	0x29B01
+0x6461	0x29B09
+0x6462	0x29C0F
+0x6463	0x29C2E
+0x6464	0x29C2D
+0x6465	0x29C91
+0x6466	0x29C99
+0x6467	0x29C9E
+0x6468	0x29C90
+0x6469	0x29C94
+0x646A	0x29C9D
+0x646B	0x29C98
+0x646C	0x29C9B
+0x646D	0x29C9C
+0x646E	0x29C9A
+0x646F	0x29D54
+0x6470	0x29F9D
+0x6471	0x29F9F
+0x6472	0x29FA3
+0x6473	0x29FA4
+0x6474	0x29FA5
+0x6475	0x2A302
+0x6476	0x2A417
+0x6477	0x2A41B
+0x6478	0x2A419
+0x6479	0x2A4D1
+0x647A	0x21537
diff --git a/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates
new file mode 100644
index 0000000..1ce4ff4
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates
@@ -0,0 +1,6388 @@
+0x2121 0x20055
+0x2122 0x20182
+0x2123 0x20189
+0x2124 0x20187
+0x2125 0x203BE
+0x2126 0x203BD
+0x2127 0x203CA
+0x2128 0x203D4
+0x2129 0x203BC
+0x212A 0x203C4
+0x212B 0x203C1
+0x212C 0x203C2
+0x212D 0x203D7
+0x212E 0x20370
+0x212F 0x203BA
+0x2130 0x203E3
+0x2131 0x203BB
+0x2132 0x204B1
+0x2133 0x204B6
+0x2134 0x204B0
+0x2135 0x2056C
+0x2136 0x2060D
+0x2137 0x20607
+0x2138 0x207F1
+0x2139 0x207F5
+0x213A 0x207ED
+0x213B 0x207EF
+0x213C 0x207EB
+0x213D 0x207EC
+0x213E 0x207EE
+0x213F 0x20807
+0x2140 0x209C4
+0x2141 0x20A08
+0x2142 0x20AB3
+0x2143 0x20AAD
+0x2144 0x20AB0
+0x2145 0x20B11
+0x2146 0x2018A
+0x2147 0x20F83
+0x2148 0x20F7A
+0x2149 0x20F82
+0x214A 0x20F68
+0x214B 0x20F71
+0x214C 0x20FB0
+0x214D 0x20FAF
+0x214F 0x20F6C
+0x2150 0x20F6F
+0x2151 0x20F62
+0x2152 0x20F65
+0x2153 0x20F81
+0x2154 0x20F7F
+0x2155 0x20F64
+0x2156 0x20F73
+0x2157 0x20F6E
+0x2158 0x20F67
+0x2159 0x20F74
+0x215A 0x20F7D
+0x215B 0x20F78
+0x215C 0x20F85
+0x215D 0x20FAA
+0x215E 0x20F88
+0x215F 0x20FA6
+0x2160 0x2F84E
+0x2161 0x20F8A
+0x2162 0x20F84
+0x2164 0x21224
+0x2165 0x21222
+0x2166 0x21223
+0x2167 0x21432
+0x2168 0x2145B
+0x2169 0x2144F
+0x216B 0x21426
+0x216C 0x2143E
+0x216D 0x21442
+0x216E 0x21447
+0x216F 0x21422
+0x2170 0x2069B
+0x2171 0x2144A
+0x2172 0x2141F
+0x2173 0x21449
+0x2174 0x2142B
+0x2175 0x21433
+0x2176 0x2F858
+0x2177 0x2142A
+0x2178 0x21428
+0x2179 0x2153D
+0x217A 0x2153C
+0x217B 0x215BF
+0x217C 0x21679
+0x217D 0x21680
+0x217E 0x2167C
+0x2221 0x2167A
+0x2222 0x21678
+0x2223 0x21882
+0x2224 0x2185C
+0x2225 0x2185A
+0x2226 0x2184B
+0x2227 0x2187C
+0x2228 0x2187F
+0x2229 0x2181F
+0x222A 0x21889
+0x222B 0x2188B
+0x222C 0x21857
+0x222D 0x2187E
+0x222E 0x2187D
+0x222F 0x21853
+0x2230 0x21A9F
+0x2231 0x21ABC
+0x2232 0x21AA5
+0x2233 0x21A86
+0x2234 0x21ADC
+0x2235 0x21AA4
+0x2236 0x21AB6
+0x2237 0x21AA2
+0x2238 0x21AB4
+0x2239 0x21B48
+0x223A 0x21B46
+0x223B 0x21BA7
+0x223C 0x21C14
+0x223D 0x21C12
+0x223E 0x21C11
+0x223F 0x21CE1
+0x2240 0x21CD0
+0x2241 0x21D26
+0x2242 0x21D28
+0x2243 0x21D29
+0x2244 0x21F2F
+0x2245 0x21F0D
+0x2246 0x21F25
+0x2247 0x21F14
+0x2248 0x21F3C
+0x2249 0x21F0B
+0x224A 0x21F11
+0x224B 0x21F30
+0x224C 0x21F18
+0x224D 0x21F19
+0x224E 0x21F36
+0x224F 0x21F17
+0x2250 0x21F10
+0x2251 0x21F15
+0x2252 0x22003
+0x2253 0x22029
+0x2254 0x2204C
+0x2255 0x2213F
+0x2256 0x2213E
+0x2257 0x22134
+0x2258 0x22142
+0x2259 0x22135
+0x225A 0x207F3
+0x225B 0x221CD
+0x225C 0x221D1
+0x225D 0x221D2
+0x225E 0x222AD
+0x225F 0x222BA
+0x2260 0x222C1
+0x2261 0x222BB
+0x2262 0x222B4
+0x2263 0x222BC
+0x2264 0x2236C
+0x2265 0x22392
+0x2266 0x22421
+0x2267 0x22424
+0x2268 0x23F19
+0x2269 0x224AD
+0x226A 0x224AE
+0x226B 0x224AB
+0x226C 0x224AC
+0x226D 0x22570
+0x226E 0x22576
+0x226F 0x22571
+0x2270 0x22577
+0x2272 0x227EC
+0x2273 0x2281C
+0x2274 0x227FB
+0x2275 0x227EE
+0x2276 0x228E2
+0x2277 0x227FD
+0x2278 0x2281E
+0x2279 0x2283B
+0x227A 0x2284A
+0x227B 0x2F8AE
+0x227D 0x2287D
+0x227E 0x22856
+0x2321 0x22844
+0x2322 0x2284B
+0x2323 0x229FA
+0x2324 0x229E8
+0x2325 0x229F8
+0x2326 0x229FF
+0x2327 0x229F7
+0x2328 0x229F6
+0x2329 0x229FE
+0x232A 0x22A07
+0x232B 0x22A5D
+0x232C 0x22CD4
+0x232D 0x2F8C3
+0x232E 0x22CC8
+0x232F 0x22CC5
+0x2330 0x2F8C0
+0x2331 0x22CC9
+0x2332 0x22D4D
+0x2333 0x22D20
+0x2334 0x22D36
+0x2335 0x22D35
+0x2336 0x22D88
+0x2337 0x22D25
+0x2338 0x22D21
+0x2339 0x22D26
+0x233B 0x22D3F
+0x233C 0x22D3B
+0x233D 0x22D24
+0x233E 0x22D43
+0x233F 0x22D4E
+0x2340 0x22D4F
+0x2341 0x22D44
+0x2342 0x22D40
+0x2343 0x22D41
+0x2344 0x22D39
+0x2345 0x22D2B
+0x2346 0x22EDD
+0x2347 0x22EDE
+0x2348 0x22FCD
+0x2349 0x22FCB
+0x234A 0x22FDB
+0x234B 0x22FD8
+0x234C 0x22FD9
+0x234D 0x22FD2
+0x234E 0x22FCA
+0x234F 0x22FD1
+0x2350 0x22FD4
+0x2351 0x22FF9
+0x2352 0x22FD0
+0x2353 0x2305E
+0x2354 0x2305D
+0x2355 0x2308A
+0x2356 0x23114
+0x2357 0x23283
+0x2358 0x23284
+0x2359 0x2329B
+0x235A 0x23282
+0x235B 0x2327D
+0x235C 0x2327C
+0x235D 0x23299
+0x235E 0x2327E
+0x235F 0x2329A
+0x2360 0x23295
+0x2361 0x2327B
+0x2362 0x23286
+0x2363 0x23348
+0x2364 0x23392
+0x2365 0x235B2
+0x2366 0x23642
+0x2367 0x23672
+0x2368 0x23615
+0x2369 0x23630
+0x236A 0x23643
+0x236B 0x2365B
+0x236C 0x2361D
+0x236D 0x23673
+0x236E 0x2362D
+0x2370 0x23621
+0x2371 0x2361C
+0x2372 0x2F8EA
+0x2373 0x23629
+0x2374 0x2361E
+0x2375 0x23633
+0x2376 0x23910
+0x2377 0x2390E
+0x2378 0x2F8F1
+0x2379 0x2390D
+0x237A 0x23911
+0x237B 0x23912
+0x237C 0x23917
+0x237D 0x23909
+0x237E 0x2390F
+0x2421 0x23998
+0x2422 0x23994
+0x2423 0x23996
+0x2424 0x23999
+0x2425 0x23995
+0x2426 0x23997
+0x2427 0x23A50
+0x2428 0x23A52
+0x2429 0x23A4D
+0x242A 0x23A57
+0x242B 0x23A53
+0x242C 0x23A56
+0x242D 0x23AB8
+0x242E 0x23B12
+0x242F 0x23BF1
+0x2430 0x23BF0
+0x2431 0x23BEE
+0x2432 0x23BEF
+0x2433 0x23BE5
+0x2434 0x23BEB
+0x2435 0x23BE7
+0x2436 0x23BF2
+0x2437 0x23BE6
+0x2438 0x23BF7
+0x2439 0x23C09
+0x243A 0x23C6B
+0x243B 0x23C6A
+0x243C 0x23E79
+0x243D 0x23ECD
+0x243E 0x23EEF
+0x243F 0x23EE4
+0x2440 0x23EE3
+0x2441 0x23F6C
+0x2442 0x23F67
+0x2443 0x23F62
+0x2444 0x23F58
+0x2445 0x23F69
+0x2446 0x23FAB
+0x2447 0x23F57
+0x2448 0x23FAD
+0x2449 0x23F54
+0x244A 0x23FAE
+0x244B 0x23F76
+0x244C 0x23F49
+0x244D 0x23F45
+0x244E 0x23F4F
+0x244F 0x2F90F
+0x2450 0x23F50
+0x2451 0x23F7D
+0x2452 0x23F44
+0x2453 0x23F66
+0x2454 0x23F48
+0x2455 0x23FA3
+0x2456 0x23F51
+0x2457 0x23F53
+0x2458 0x2F910
+0x2459 0x23F60
+0x245A 0x23F47
+0x245B 0x23F5E
+0x245C 0x23F85
+0x245D 0x23FAC
+0x245E 0x23F6D
+0x245F 0x23F75
+0x2460 0x23FA8
+0x2462 0x23F43
+0x2463 0x23F4E
+0x2464 0x23F5C
+0x2465 0x23F56
+0x2466 0x23F6E
+0x2467 0x23F63
+0x2468 0x23F6A
+0x2469 0x24356
+0x246A 0x24312
+0x246B 0x2435C
+0x246C 0x24358
+0x246D 0x24355
+0x246E 0x2437E
+0x246F 0x243A8
+0x2470 0x24311
+0x2471 0x24359
+0x2472 0x2435A
+0x2473 0x24367
+0x2474 0x24354
+0x2475 0x2435B
+0x2476 0x243F0
+0x2477 0x24529
+0x2478 0x2452C
+0x2479 0x2452A
+0x247A 0x24527
+0x247B 0x24567
+0x247C 0x24568
+0x247D 0x24593
+0x247E 0x24595
+0x2521 0x2459A
+0x2522 0x245EE
+0x2523 0x245F1
+0x2524 0x245ED
+0x2525 0x245E9
+0x2526 0x246CB
+0x2527 0x246DF
+0x2528 0x246DB
+0x2529 0x2483C
+0x252A 0x2484E
+0x252B 0x2486C
+0x252C 0x2487B
+0x252D 0x2487C
+0x252E 0x24883
+0x252F 0x2486B
+0x2530 0x24866
+0x2531 0x24863
+0x2532 0x248A0
+0x2533 0x24885
+0x2534 0x24868
+0x2535 0x248A2
+0x2536 0x249EC
+0x2538 0x249E7
+0x2539 0x24A10
+0x253A 0x24A18
+0x253B 0x24A3A
+0x253C 0x24A1A
+0x253D 0x24A38
+0x253E 0x24A41
+0x253F 0x24A1B
+0x2540 0x24A14
+0x2541 0x24A1C
+0x2542 0x24A1D
+0x2543 0x24B12
+0x2544 0x24B0D
+0x2545 0x24B07
+0x2546 0x24B7E
+0x2547 0x24B7F
+0x2548 0x20AB9
+0x2549 0x24B80
+0x254A 0x24B7A
+0x254B 0x24BF3
+0x254C 0x24CB9
+0x254D 0x24CBB
+0x254E 0x24CBA
+0x254F 0x24CBD
+0x2550 0x24CB7
+0x2551 0x24CBF
+0x2552 0x24D21
+0x2553 0x24E3A
+0x2554 0x24E3D
+0x2555 0x24E36
+0x2556 0x24E49
+0x2557 0x24E81
+0x2559 0x24E3F
+0x255A 0x24E4D
+0x255B 0x24E3E
+0x255D 0x24E30
+0x255E 0x24E4F
+0x255F 0x24F37
+0x2560 0x24F98
+0x2561 0x24F99
+0x2562 0x25011
+0x2563 0x2500D
+0x2564 0x25088
+0x2565 0x2508A
+0x2566 0x2521C
+0x2567 0x25255
+0x2568 0x25256
+0x2569 0x25262
+0x256A 0x25257
+0x256B 0x25242
+0x256C 0x25210
+0x256D 0x2524D
+0x256E 0x2525A
+0x256F 0x25266
+0x2570 0x25246
+0x2571 0x2287E
+0x2572 0x2524F
+0x2573 0x262F9
+0x2574 0x25387
+0x2575 0x25384
+0x2576 0x253F4
+0x2577 0x253F5
+0x2578 0x253F2
+0x2579 0x253F7
+0x257A 0x25545
+0x257B 0x2F950
+0x257C 0x25549
+0x257D 0x25535
+0x257E 0x254FD
+0x2621 0x25530
+0x2622 0x25543
+0x2623 0x25546
+0x2625 0x25533
+0x2626 0x256C6
+0x2627 0x2F956
+0x2628 0x256D4
+0x2629 0x271D8
+0x262A 0x256E0
+0x262B 0x20FA7
+0x262C 0x25744
+0x262D 0x20398
+0x262E 0x25854
+0x262F 0x2583E
+0x2630 0x25835
+0x2631 0x2583A
+0x2633 0x25834
+0x2634 0x25839
+0x2635 0x25846
+0x2636 0x2585A
+0x2637 0x2585B
+0x2638 0x2583C
+0x2639 0x259DC
+0x263A 0x259D6
+0x263B 0x259D0
+0x263C 0x2F95E
+0x263D 0x25AAC
+0x263E 0x2F95D
+0x263F 0x25AA5
+0x2640 0x25BF4
+0x2641 0x25C24
+0x2642 0x25BE0
+0x2643 0x25BFD
+0x2644 0x25BF2
+0x2645 0x25BFC
+0x2646 0x25C02
+0x2647 0x25BF1
+0x2648 0x25BFF
+0x2649 0x25BD2
+0x264A 0x25BD8
+0x264B 0x25BD3
+0x264C 0x25BF9
+0x264D 0x2F963
+0x264E 0x25BED
+0x264F 0x25BF7
+0x2650 0x25BF0
+0x2651 0x25BD7
+0x2652 0x25C09
+0x2653 0x25BF5
+0x2654 0x25EC2
+0x2655 0x25EC5
+0x2656 0x25ECF
+0x2658 0x25EC1
+0x2659 0x25EC6
+0x265A 0x25ED4
+0x265B 0x25ECE
+0x265C 0x2609B
+0x265D 0x26099
+0x265E 0x2608F
+0x265F 0x260B7
+0x2660 0x26082
+0x2661 0x26093
+0x2662 0x260B4
+0x2663 0x260C1
+0x2664 0x26090
+0x2665 0x2609A
+0x2666 0x26094
+0x2667 0x2609C
+0x2668 0x260B5
+0x2669 0x2F96F
+0x266A 0x2F96E
+0x266B 0x2609F
+0x266C 0x2608E
+0x266D 0x2609E
+0x266E 0x2623C
+0x266F 0x26247
+0x2670 0x26241
+0x2671 0x262EB
+0x2672 0x262EC
+0x2673 0x262ED
+0x2674 0x262EE
+0x2675 0x262DF
+0x2676 0x262F2
+0x2677 0x2630D
+0x2678 0x2630E
+0x2679 0x20186
+0x267A 0x263A9
+0x267B 0x263A4
+0x267C 0x263A5
+0x267D 0x2645F
+0x267E 0x2645A
+0x2721 0x26466
+0x2722 0x26468
+0x2723 0x2646A
+0x2724 0x26464
+0x2725 0x26465
+0x2726 0x264C1
+0x2727 0x264D8
+0x2728 0x2F97B
+0x2729 0x264D9
+0x272A 0x26509
+0x272B 0x265AA
+0x272C 0x265A3
+0x272D 0x265B9
+0x272E 0x259E2
+0x272F 0x265A5
+0x2730 0x265AB
+0x2731 0x26620
+0x2732 0x26789
+0x2733 0x2678B
+0x2734 0x267DB
+0x2735 0x267E4
+0x2736 0x267EF
+0x2737 0x267E2
+0x2738 0x267E9
+0x2739 0x267F0
+0x273A 0x267F3
+0x273B 0x267DD
+0x273C 0x2681E
+0x273D 0x2691D
+0x273E 0x26946
+0x273F 0x2697C
+0x2740 0x26980
+0x2741 0x26981
+0x2742 0x26982
+0x2743 0x26987
+0x2744 0x26988
+0x2745 0x2698A
+0x2746 0x2698C
+0x2747 0x269E7
+0x2748 0x269EB
+0x2749 0x269EA
+0x274A 0x26A68
+0x274B 0x26A6B
+0x274C 0x26A69
+0x274D 0x26A66
+0x274E 0x26A6A
+0x274F 0x26A65
+0x2750 0x26AE5
+0x2751 0x26AE4
+0x2752 0x26AE6
+0x2753 0x26D18
+0x2754 0x26E24
+0x2755 0x26E48
+0x2756 0x26E2F
+0x2757 0x26E7E
+0x2758 0x26D89
+0x2759 0x26E1E
+0x275A 0x26E49
+0x275B 0x26E26
+0x275C 0x26E09
+0x275D 0x26E34
+0x275E 0x26E2D
+0x275F 0x26E4A
+0x2760 0x26E15
+0x2761 0x2F9A9
+0x2762 0x26E33
+0x2763 0x26E28
+0x2764 0x26E27
+0x2765 0x26E20
+0x2766 0x26E2B
+0x2767 0x26E29
+0x2768 0x26E6A
+0x2769 0x26E0B
+0x276A 0x26E0E
+0x276B 0x26E1C
+0x276C 0x26DFF
+0x276D 0x2F9AA
+0x276E 0x26E35
+0x276F 0x26E11
+0x2770 0x26E4B
+0x2771 0x26E4C
+0x2772 0x26E1F
+0x2773 0x26E0F
+0x2774 0x26E39
+0x2775 0x26E68
+0x2776 0x26E1D
+0x2777 0x26E08
+0x2778 0x26E0C
+0x2779 0x26E0D
+0x277A 0x26E62
+0x277B 0x26EAF
+0x277C 0x26E32
+0x277D 0x26E2C
+0x277E 0x26E64
+0x2821 0x26E04
+0x2822 0x26E16
+0x2823 0x26E4D
+0x2824 0x26E07
+0x2825 0x26EAE
+0x2826 0x271D4
+0x2827 0x271D1
+0x2828 0x271D5
+0x2829 0x271D0
+0x282A 0x27371
+0x282B 0x2735D
+0x282C 0x2735B
+0x282D 0x2737A
+0x282E 0x2F9BD
+0x282F 0x2737F
+0x2830 0x27379
+0x2831 0x27367
+0x2832 0x2739E
+0x2833 0x27394
+0x2834 0x27364
+0x2835 0x2735E
+0x2836 0x27381
+0x2837 0x2735A
+0x2838 0x27357
+0x2839 0x2737C
+0x283A 0x27398
+0x283B 0x27366
+0x283C 0x2737E
+0x283D 0x27382
+0x283E 0x27368
+0x283F 0x2735F
+0x2840 0x27363
+0x2841 0x27397
+0x2843 0x27353
+0x2844 0x2737B
+0x2845 0x2737D
+0x2846 0x27378
+0x2847 0x27406
+0x2848 0x275C0
+0x2849 0x275C2
+0x284A 0x275C3
+0x284B 0x276DC
+0x284C 0x276E6
+0x284D 0x276EC
+0x284E 0x276F2
+0x284F 0x276E8
+0x2850 0x276EB
+0x2851 0x276EA
+0x2852 0x276E5
+0x2853 0x276E0
+0x2854 0x276D0
+0x2855 0x276D8
+0x2856 0x276D5
+0x2857 0x276D3
+0x2858 0x276E4
+0x2859 0x276F3
+0x285A 0x276DB
+0x285B 0x2772F
+0x285C 0x277F9
+0x285D 0x2785D
+0x285E 0x2785B
+0x285F 0x2784C
+0x2860 0x27858
+0x2861 0x27860
+0x2862 0x27853
+0x2863 0x27850
+0x2864 0x27907
+0x2865 0x27908
+0x2866 0x278F4
+0x2867 0x278F6
+0x2868 0x27904
+0x2869 0x278FD
+0x286A 0x27905
+0x286B 0x27A28
+0x286C 0x27A56
+0x286D 0x27A42
+0x286E 0x27A5C
+0x286F 0x27A3D
+0x2870 0x27A2F
+0x2871 0x27A2B
+0x2872 0x27A58
+0x2873 0x27A61
+0x2874 0x27A2C
+0x2875 0x27A51
+0x2876 0x27A50
+0x2877 0x27A3C
+0x2878 0x27A36
+0x287A 0x27A60
+0x287B 0x27A5B
+0x287C 0x27A2E
+0x287D 0x27A40
+0x287E 0x27A5F
+0x2921 0x27A26
+0x2922 0x27A2D
+0x2923 0x27A5E
+0x2924 0x27A3B
+0x2925 0x27BEF
+0x2926 0x27BF3
+0x2927 0x27BEE
+0x2928 0x27BED
+0x2929 0x27C5A
+0x292A 0x27C62
+0x292B 0x27C5B
+0x292C 0x27C5F
+0x292D 0x27C5E
+0x292E 0x27C64
+0x292F 0x27CE0
+0x2930 0x27CE1
+0x2931 0x27CE5
+0x2932 0x27DA5
+0x2933 0x27D9B
+0x2934 0x27D9F
+0x2935 0x27D9C
+0x2937 0x27DAA
+0x2938 0x27DA4
+0x2939 0x27DA3
+0x293A 0x27E67
+0x293B 0x27F26
+0x293C 0x27F1A
+0x293E 0x27F1C
+0x293F 0x27F15
+0x2940 0x27F1B
+0x2941 0x27F18
+0x2942 0x27F1E
+0x2943 0x27F25
+0x2944 0x2F9DC
+0x2945 0x2807B
+0x2946 0x28075
+0x2947 0x28093
+0x2948 0x2808F
+0x2949 0x2807C
+0x294A 0x2809B
+0x294B 0x28088
+0x294C 0x28091
+0x294D 0x2807E
+0x294F 0x28086
+0x2950 0x2825B
+0x2951 0x28254
+0x2952 0x28335
+0x2953 0x28340
+0x2954 0x28337
+0x2955 0x28329
+0x2956 0x28326
+0x2957 0x28323
+0x2958 0x28330
+0x2959 0x28320
+0x295A 0x28328
+0x295B 0x28332
+0x295C 0x2832A
+0x295D 0x28331
+0x295E 0x28324
+0x295F 0x28341
+0x2960 0x28342
+0x2961 0x28343
+0x2962 0x28325
+0x2963 0x28338
+0x2964 0x2841C
+0x2965 0x2841D
+0x2966 0x2841E
+0x2967 0x284F6
+0x2968 0x285A5
+0x2969 0x28589
+0x296A 0x2859D
+0x296B 0x2858A
+0x296C 0x28587
+0x296D 0x285AB
+0x296E 0x28586
+0x296F 0x2859E
+0x2970 0x28593
+0x2971 0x285A1
+0x2972 0x28588
+0x2973 0x285A3
+0x2974 0x2859F
+0x2975 0x285A0
+0x2976 0x286FF
+0x2977 0x28700
+0x2978 0x28702
+0x2979 0x286F8
+0x297A 0x286F7
+0x297B 0x28701
+0x297C 0x28787
+0x297D 0x28789
+0x297E 0x28776
+0x2A21 0x2876E
+0x2A22 0x28777
+0x2A23 0x28782
+0x2A24 0x28785
+0x2A25 0x28783
+0x2A26 0x28784
+0x2A27 0x28857
+0x2A28 0x2884B
+0x2A29 0x28856
+0x2A2A 0x2885D
+0x2A2B 0x28860
+0x2A2C 0x2884D
+0x2A2D 0x28855
+0x2A2E 0x28854
+0x2A2F 0x28853
+0x2A30 0x28850
+0x2A31 0x28863
+0x2A32 0x28862
+0x2A33 0x28917
+0x2A34 0x28916
+0x2A35 0x2892D
+0x2A36 0x289D9
+0x2A37 0x289BF
+0x2A39 0x289B2
+0x2A3A 0x289AC
+0x2A3B 0x289B0
+0x2A3C 0x289CF
+0x2A3D 0x289B8
+0x2A3F 0x289D3
+0x2A40 0x289B1
+0x2A41 0x289AF
+0x2A42 0x289CE
+0x2A43 0x289B4
+0x2A44 0x289B7
+0x2A45 0x289D5
+0x2A47 0x28D38
+0x2A48 0x28D28
+0x2A49 0x28D3F
+0x2A4A 0x28D40
+0x2A4B 0x28D41
+0x2A4C 0x28D33
+0x2A4D 0x28D2B
+0x2A4E 0x28D2E
+0x2A4F 0x28F11
+0x2A50 0x28F18
+0x2A51 0x28F17
+0x2A52 0x28F19
+0x2A53 0x28F16
+0x2A55 0x28F0D
+0x2A56 0x28F26
+0x2A57 0x28F79
+0x2A58 0x28FD8
+0x2A59 0x28FF3
+0x2A5A 0x28FD7
+0x2A5B 0x28FCC
+0x2A5C 0x28FCF
+0x2A5D 0x28FCB
+0x2A5E 0x28FD1
+0x2A5F 0x28FCE
+0x2A60 0x28FD4
+0x2A61 0x28FD5
+0x2A62 0x28FD3
+0x2A63 0x28FD6
+0x2A64 0x28FCD
+0x2A65 0x28FDA
+0x2A66 0x28FD2
+0x2A67 0x28FDE
+0x2A68 0x290CC
+0x2A69 0x290B8
+0x2A6A 0x290B7
+0x2A6B 0x290C2
+0x2A6C 0x290C3
+0x2A6D 0x291FA
+0x2A6E 0x291F9
+0x2A6F 0x2921F
+0x2A70 0x2921D
+0x2A71 0x24382
+0x2A72 0x292A6
+0x2A73 0x29290
+0x2A74 0x2929E
+0x2A75 0x29298
+0x2A76 0x29293
+0x2A77 0x29292
+0x2A78 0x292A5
+0x2A79 0x29295
+0x2A7A 0x293A9
+0x2A7B 0x293A8
+0x2A7C 0x293AA
+0x2A7D 0x293AB
+0x2A7E 0x293AC
+0x2B21 0x2941F
+0x2B22 0x29422
+0x2B23 0x294AA
+0x2B24 0x29496
+0x2B25 0x29491
+0x2B26 0x294AB
+0x2B27 0x294A2
+0x2B28 0x294A4
+0x2B29 0x2949D
+0x2B2A 0x29497
+0x2B2B 0x2947D
+0x2B2C 0x2949F
+0x2B2D 0x2949C
+0x2B2E 0x29499
+0x2B2F 0x294A6
+0x2B30 0x29492
+0x2B31 0x294A7
+0x2B32 0x295C9
+0x2B33 0x295C8
+0x2B34 0x295C7
+0x2B35 0x295CB
+0x2B36 0x29674
+0x2B37 0x296C9
+0x2B39 0x296D2
+0x2B3A 0x296DB
+0x2B3B 0x296EB
+0x2B3C 0x296E9
+0x2B3D 0x296EF
+0x2B3E 0x296EE
+0x2B3F 0x296F9
+0x2B40 0x296DE
+0x2B41 0x29816
+0x2B42 0x29845
+0x2B43 0x2987F
+0x2B44 0x29898
+0x2B45 0x2989F
+0x2B46 0x29886
+0x2B47 0x29890
+0x2B48 0x2989A
+0x2B49 0x2989D
+0x2B4A 0x2988D
+0x2B4B 0x2989C
+0x2B4C 0x298A0
+0x2B4D 0x298A7
+0x2B4E 0x2988F
+0x2B4F 0x29A41
+0x2B50 0x29A35
+0x2B51 0x29A37
+0x2B52 0x29A30
+0x2B53 0x29A3A
+0x2B54 0x29A36
+0x2B55 0x2FA08
+0x2B56 0x29ACA
+0x2B57 0x29B12
+0x2B58 0x29B15
+0x2B59 0x29B22
+0x2B5A 0x29B13
+0x2B5B 0x29B18
+0x2B5C 0x29B21
+0x2B5D 0x29C10
+0x2B5E 0x29C20
+0x2B5F 0x29C2F
+0x2B60 0x29CA5
+0x2B61 0x29CA3
+0x2B62 0x29CB6
+0x2B63 0x29CAB
+0x2B64 0x29D68
+0x2B65 0x29D67
+0x2B66 0x29D6F
+0x2B67 0x29D77
+0x2B68 0x29D64
+0x2B69 0x29D78
+0x2B6B 0x29D76
+0x2B6C 0x29D6E
+0x2B6E 0x29FD0
+0x2B6F 0x29FB3
+0x2B70 0x29FCB
+0x2B71 0x29FD6
+0x2B72 0x29FB1
+0x2B73 0x29FB4
+0x2B74 0x29FD7
+0x2B75 0x29FC6
+0x2B76 0x29FBA
+0x2B77 0x29FD1
+0x2B78 0x29FD2
+0x2B79 0x29FB5
+0x2B7A 0x29FC4
+0x2B7B 0x29FCC
+0x2B7C 0x29FBB
+0x2B7D 0x29FB2
+0x2B7E 0x2A25B
+0x2C21 0x2A25A
+0x2C22 0x2A259
+0x2C23 0x2A299
+0x2C24 0x2A294
+0x2C25 0x2A296
+0x2C26 0x2A293
+0x2C27 0x2A291
+0x2C28 0x2A28F
+0x2C29 0x2A298
+0x2C2A 0x2A30C
+0x2C2B 0x2A30A
+0x2C2C 0x2A30E
+0x2C2D 0x2A312
+0x2C2E 0x2A311
+0x2C2F 0x2A30B
+0x2C30 0x2A39A
+0x2C32 0x2A3B4
+0x2C34 0x2A41C
+0x2C35 0x2A420
+0x2C36 0x2A421
+0x2C37 0x2A4D3
+0x2C38 0x2A4D2
+0x2C39 0x2A538
+0x2C3B 0x24CCF
+0x2C3C 0x2011D
+0x2C3D 0x20192
+0x2C3E 0x2018F
+0x2C3F 0x2018C
+0x2C40 0x203EA
+0x2C41 0x204B9
+0x2C42 0x2056E
+0x2C43 0x205A0
+0x2C44 0x291DD
+0x2C45 0x20612
+0x2C46 0x20617
+0x2C47 0x2066D
+0x2C48 0x20805
+0x2C49 0x207FB
+0x2C4A 0x207FD
+0x2C4B 0x20806
+0x2C4C 0x20800
+0x2C4D 0x207FF
+0x2C4E 0x207FE
+0x2C4F 0x208B6
+0x2C50 0x20905
+0x2C51 0x20907
+0x2C52 0x20ABC
+0x2C53 0x20ABB
+0x2C54 0x20B8B
+0x2C55 0x20B87
+0x2C56 0x27BFB
+0x2C57 0x20FE7
+0x2C58 0x20FE6
+0x2C59 0x20FE2
+0x2C5A 0x285D3
+0x2C5B 0x20FD9
+0x2C5C 0x20FCA
+0x2C5D 0x21012
+0x2C5E 0x21010
+0x2C5F 0x20FDC
+0x2C60 0x20FD0
+0x2C61 0x20F8B
+0x2C62 0x21013
+0x2C63 0x22A10
+0x2C64 0x20FDA
+0x2C65 0x2F84F
+0x2C66 0x20FFD
+0x2C67 0x20FE5
+0x2C68 0x20FCC
+0x2C69 0x21039
+0x2C6A 0x20FC7
+0x2C6B 0x20FD8
+0x2C6C 0x21460
+0x2C6D 0x21464
+0x2C6E 0x21486
+0x2C6F 0x2145E
+0x2C70 0x21466
+0x2C71 0x2145F
+0x2C72 0x21477
+0x2C73 0x21482
+0x2C74 0x21496
+0x2C75 0x2153E
+0x2C76 0x21579
+0x2C77 0x2157A
+0x2C78 0x21688
+0x2C79 0x21689
+0x2C7A 0x2168C
+0x2C7B 0x243E0
+0x2C7C 0x2167B
+0x2C7D 0x21686
+0x2C7E 0x21894
+0x2D21 0x21897
+0x2D22 0x218B7
+0x2D23 0x218B5
+0x2D24 0x218B8
+0x2D25 0x21893
+0x2D26 0x218B2
+0x2D27 0x218B4
+0x2D28 0x21899
+0x2D29 0x218C3
+0x2D2A 0x2189D
+0x2D2B 0x2189B
+0x2D2C 0x218A3
+0x2D2E 0x2199F
+0x2D2F 0x2199E
+0x2D30 0x219A3
+0x2D31 0x219A0
+0x2D32 0x219A1
+0x2D33 0x21AC5
+0x2D34 0x21AC6
+0x2D35 0x21ABE
+0x2D36 0x21AC4
+0x2D37 0x21ABF
+0x2D38 0x21B4C
+0x2D39 0x21B4A
+0x2D3A 0x21BB1
+0x2D3B 0x21C15
+0x2D3C 0x21C17
+0x2D3D 0x21C10
+0x2D3E 0x21C18
+0x2D3F 0x21CE0
+0x2D40 0x21CDF
+0x2D41 0x21D27
+0x2D42 0x21F43
+0x2D43 0x21F48
+0x2D44 0x21F1D
+0x2D45 0x21F50
+0x2D46 0x21F58
+0x2D47 0x21F47
+0x2D48 0x21F54
+0x2D49 0x21F53
+0x2D4A 0x21F40
+0x2D4B 0x21F55
+0x2D4D 0x21F5A
+0x2D4E 0x22470
+0x2D4F 0x2215B
+0x2D50 0x2214D
+0x2D51 0x22156
+0x2D52 0x2214F
+0x2D53 0x2F887
+0x2D54 0x22159
+0x2D55 0x2F888
+0x2D56 0x22154
+0x2D57 0x22153
+0x2D58 0x22150
+0x2D59 0x222B3
+0x2D5A 0x2236E
+0x2D5C 0x2236F
+0x2D5D 0x22393
+0x2D5E 0x22429
+0x2D5F 0x22425
+0x2D60 0x22428
+0x2D61 0x2246F
+0x2D62 0x232B8
+0x2D63 0x2F897
+0x2D64 0x224B3
+0x2D65 0x22579
+0x2D66 0x2257E
+0x2D67 0x2257C
+0x2D68 0x22583
+0x2D69 0x2F8AC
+0x2D6A 0x22800
+0x2D6B 0x22834
+0x2D6C 0x22865
+0x2D6D 0x22836
+0x2D6E 0x228A7
+0x2D6F 0x22859
+0x2D70 0x22858
+0x2D71 0x22831
+0x2D72 0x22862
+0x2D73 0x22838
+0x2D74 0x22873
+0x2D75 0x2283E
+0x2D76 0x22855
+0x2D77 0x22854
+0x2D78 0x22895
+0x2D79 0x2F8AD
+0x2D7A 0x228A5
+0x2D7B 0x22894
+0x2D7C 0x2289A
+0x2D7D 0x2289B
+0x2D7E 0x22899
+0x2E21 0x2289F
+0x2E22 0x22853
+0x2E23 0x22A12
+0x2E24 0x22A0A
+0x2E25 0x22A09
+0x2E26 0x22A0C
+0x2E27 0x22A0B
+0x2E28 0x22A0E
+0x2E29 0x22A0D
+0x2E2A 0x22A08
+0x2E2B 0x22D38
+0x2E2C 0x22D3A
+0x2E2D 0x22D37
+0x2E2E 0x22D3D
+0x2E2F 0x22D2D
+0x2E30 0x22D82
+0x2E31 0x22D95
+0x2E32 0x22D87
+0x2E33 0x22D9D
+0x2E34 0x22DB5
+0x2E35 0x22D81
+0x2E36 0x22DC7
+0x2E37 0x22D9B
+0x2E38 0x22D98
+0x2E39 0x22D94
+0x2E3A 0x22D86
+0x2E3B 0x22D90
+0x2E3C 0x22D34
+0x2E3D 0x22D8E
+0x2E3E 0x22D85
+0x2E3F 0x22DA6
+0x2E40 0x22D96
+0x2E41 0x22FEA
+0x2E42 0x22FDF
+0x2E43 0x232BD
+0x2E44 0x22FF7
+0x2E45 0x22FEB
+0x2E46 0x22FE0
+0x2E47 0x22FE8
+0x2E48 0x22FE1
+0x2E49 0x22FE9
+0x2E4A 0x22FEE
+0x2E4B 0x22FE5
+0x2E4C 0x22FEC
+0x2E4D 0x23063
+0x2E4E 0x230C6
+0x2E4F 0x230C2
+0x2E50 0x230C1
+0x2E51 0x230C0
+0x2E52 0x230C3
+0x2E53 0x23118
+0x2E54 0x232AE
+0x2E55 0x232A3
+0x2E56 0x232C5
+0x2E57 0x232A0
+0x2E58 0x232B4
+0x2E59 0x232A5
+0x2E5B 0x232A4
+0x2E5C 0x232A8
+0x2E5D 0x232A6
+0x2E5E 0x236A8
+0x2E5F 0x2368D
+0x2E60 0x23682
+0x2E61 0x2369E
+0x2E62 0x23689
+0x2E63 0x23683
+0x2E64 0x23691
+0x2E65 0x236A6
+0x2E66 0x2369A
+0x2E67 0x23690
+0x2E68 0x23685
+0x2E69 0x2367D
+0x2E6A 0x2F8EC
+0x2E6B 0x2369B
+0x2E6C 0x236A5
+0x2E6D 0x236F0
+0x2E6E 0x23696
+0x2E6F 0x23688
+0x2E70 0x236D6
+0x2E71 0x236D8
+0x2E72 0x23686
+0x2E73 0x236A4
+0x2E74 0x23697
+0x2E75 0x2391C
+0x2E76 0x23919
+0x2E77 0x2399E
+0x2E78 0x2399F
+0x2E79 0x2399D
+0x2E7A 0x2399C
+0x2E7B 0x23A5D
+0x2E7C 0x23A5E
+0x2E7D 0x23A73
+0x2E7E 0x23A63
+0x2F21 0x23ABE
+0x2F22 0x23AC1
+0x2F23 0x23ABC
+0x2F24 0x23ABF
+0x2F25 0x23ABB
+0x2F26 0x23ABD
+0x2F27 0x23B13
+0x2F28 0x23B14
+0x2F29 0x23BF8
+0x2F2A 0x23BFA
+0x2F2B 0x23C06
+0x2F2C 0x23BFE
+0x2F2D 0x23C51
+0x2F2E 0x2400B
+0x2F2F 0x23FF1
+0x2F30 0x23FA9
+0x2F31 0x23FD5
+0x2F32 0x23FDC
+0x2F33 0x23FCB
+0x2F34 0x23FF2
+0x2F35 0x2405F
+0x2F36 0x23FDB
+0x2F37 0x23FD6
+0x2F38 0x23FD9
+0x2F39 0x23FD1
+0x2F3A 0x23FCF
+0x2F3B 0x23FD8
+0x2F3C 0x23FE0
+0x2F3D 0x23FD4
+0x2F3E 0x23FF3
+0x2F3F 0x24005
+0x2F40 0x23FCE
+0x2F41 0x23FF4
+0x2F42 0x2F912
+0x2F43 0x23FDA
+0x2F44 0x2400E
+0x2F45 0x24006
+0x2F46 0x23FD7
+0x2F47 0x23FCD
+0x2F48 0x24007
+0x2F49 0x23FE1
+0x2F4A 0x24008
+0x2F4B 0x243BE
+0x2F4C 0x243EF
+0x2F4D 0x243D9
+0x2F4E 0x243DA
+0x2F50 0x243A0
+0x2F51 0x243DF
+0x2F52 0x2439E
+0x2F53 0x243BF
+0x2F54 0x243AF
+0x2F55 0x243A7
+0x2F56 0x243AA
+0x2F57 0x243F4
+0x2F58 0x243AE
+0x2F59 0x243B5
+0x2F5A 0x243B8
+0x2F5B 0x243DB
+0x2F5C 0x243C0
+0x2F5D 0x243B7
+0x2F5E 0x243A2
+0x2F5F 0x243DD
+0x2F60 0x243A1
+0x2F61 0x243A5
+0x2F62 0x243B4
+0x2F63 0x243A6
+0x2F64 0x243AB
+0x2F65 0x243AC
+0x2F66 0x2439F
+0x2F67 0x243B1
+0x2F68 0x243FC
+0x2F69 0x2452E
+0x2F6A 0x24530
+0x2F6B 0x24599
+0x2F6C 0x245F8
+0x2F6D 0x245F6
+0x2F6E 0x246F4
+0x2F6F 0x246EB
+0x2F70 0x246E1
+0x2F71 0x246E4
+0x2F72 0x24875
+0x2F73 0x24869
+0x2F75 0x24899
+0x2F76 0x2489E
+0x2F77 0x24894
+0x2F78 0x24893
+0x2F79 0x24891
+0x2F7A 0x24A19
+0x2F7B 0x24A17
+0x2F7C 0x24A49
+0x2F7D 0x24A47
+0x2F7E 0x24A48
+0x3021 0x24A52
+0x3022 0x24A40
+0x3023 0x24A63
+0x3024 0x24A46
+0x3025 0x24A5F
+0x3026 0x24B0E
+0x3027 0x24B85
+0x3028 0x24B87
+0x3029 0x24BCB
+0x302A 0x24BCC
+0x302B 0x24BC9
+0x302C 0x24CCB
+0x302D 0x21CE7
+0x302E 0x24D20
+0x302F 0x24E5F
+0x3030 0x24E60
+0x3031 0x24E6A
+0x3032 0x24E76
+0x3033 0x24E73
+0x3034 0x24E71
+0x3035 0x24E66
+0x3037 0x24E6B
+0x3038 0x24E79
+0x3039 0x24E7B
+0x303A 0x24F3C
+0x303B 0x24F9E
+0x303C 0x24F9C
+0x303D 0x2501C
+0x303E 0x2501E
+0x303F 0x25021
+0x3040 0x25096
+0x3041 0x250A1
+0x3042 0x250B6
+0x3043 0x250A0
+0x3044 0x25094
+0x3045 0x25097
+0x3046 0x25281
+0x3047 0x25286
+0x3048 0x252C0
+0x3049 0x2528A
+0x304A 0x2F94B
+0x304B 0x25285
+0x304C 0x25295
+0x304D 0x25249
+0x304E 0x25282
+0x304F 0x25284
+0x3050 0x22878
+0x3051 0x25290
+0x3052 0x252B1
+0x3053 0x253FE
+0x3054 0x253FB
+0x3055 0x25550
+0x3056 0x25556
+0x3057 0x2555A
+0x3058 0x2554C
+0x305A 0x25557
+0x305B 0x256E1
+0x305C 0x256D9
+0x305D 0x256DB
+0x305E 0x256F4
+0x305F 0x25745
+0x3060 0x25747
+0x3061 0x25874
+0x3062 0x2586B
+0x3063 0x25868
+0x3064 0x25869
+0x3065 0x25879
+0x3066 0x2F95B
+0x3067 0x25880
+0x3068 0x25881
+0x3069 0x25861
+0x306A 0x25870
+0x306B 0x2586F
+0x306C 0x25873
+0x306D 0x2585D
+0x306E 0x259FA
+0x3070 0x259F3
+0x3071 0x25A0A
+0x3072 0x25A17
+0x3073 0x2F95F
+0x3074 0x25AB0
+0x3075 0x25C3E
+0x3076 0x25C46
+0x3077 0x25C4F
+0x3078 0x25C44
+0x3079 0x25C69
+0x307A 0x25C33
+0x307B 0x25C2F
+0x307C 0x25C4E
+0x307D 0x25C3A
+0x307E 0x25C2B
+0x3121 0x25CA9
+0x3122 0x25C50
+0x3123 0x25C45
+0x3124 0x25C37
+0x3125 0x25C25
+0x3126 0x25C2C
+0x3127 0x25C3F
+0x3128 0x25C34
+0x3129 0x25C29
+0x312A 0x25C1E
+0x312B 0x25C3D
+0x312C 0x25EED
+0x312D 0x2F966
+0x312E 0x25EF3
+0x312F 0x25EEA
+0x3130 0x25EEB
+0x3131 0x260CC
+0x3132 0x260CE
+0x3133 0x260D0
+0x3134 0x260E3
+0x3135 0x260E0
+0x3136 0x260D1
+0x3137 0x260DC
+0x3138 0x260DD
+0x3139 0x260F0
+0x313A 0x260DB
+0x313B 0x260E5
+0x313C 0x260F1
+0x313D 0x260C9
+0x313E 0x260E8
+0x313F 0x260E7
+0x3140 0x260C8
+0x3141 0x260DE
+0x3142 0x260CD
+0x3143 0x260C5
+0x3144 0x260C6
+0x3145 0x260E4
+0x3146 0x260C3
+0x3147 0x262FB
+0x3148 0x262FC
+0x3149 0x262FE
+0x314A 0x26303
+0x314B 0x26300
+0x314C 0x262FD
+0x314D 0x26305
+0x314E 0x26313
+0x314F 0x263A7
+0x3150 0x263B4
+0x3151 0x26470
+0x3152 0x26474
+0x3153 0x26471
+0x3154 0x26475
+0x3155 0x2647D
+0x3156 0x26473
+0x3157 0x264C4
+0x3158 0x264C3
+0x3159 0x264DE
+0x315A 0x264DD
+0x315B 0x26511
+0x315C 0x2650F
+0x315D 0x26510
+0x315E 0x265C3
+0x315F 0x265C2
+0x3160 0x265CA
+0x3161 0x265C1
+0x3162 0x26623
+0x3163 0x267B1
+0x3164 0x26824
+0x3165 0x26811
+0x3166 0x26825
+0x3167 0x2680A
+0x3168 0x2681F
+0x3169 0x26820
+0x316A 0x26814
+0x316B 0x26828
+0x316C 0x26803
+0x316D 0x26812
+0x316E 0x2680B
+0x316F 0x26817
+0x3170 0x22A11
+0x3171 0x26949
+0x3172 0x26989
+0x3173 0x26990
+0x3174 0x2698F
+0x3175 0x26996
+0x3176 0x26995
+0x3177 0x26993
+0x3178 0x269ED
+0x3179 0x269F0
+0x317A 0x243DE
+0x317B 0x26A85
+0x317C 0x26A77
+0x317D 0x26A7A
+0x317E 0x26A84
+0x3221 0x26A79
+0x3222 0x26A7D
+0x3223 0x26A7B
+0x3224 0x26AED
+0x3225 0x26AEC
+0x3226 0x26DF6
+0x3227 0x26D9B
+0x3228 0x26E9D
+0x3229 0x26F11
+0x322A 0x26EC4
+0x322B 0x26EC8
+0x322C 0x26EDF
+0x322D 0x26EBF
+0x322E 0x26EB3
+0x322F 0x26EBA
+0x3230 0x26F10
+0x3231 0x26F06
+0x3232 0x26E88
+0x3233 0x26E9A
+0x3234 0x26EE0
+0x3235 0x26ECC
+0x3236 0x26EB5
+0x3237 0x26EE1
+0x3238 0x26EBC
+0x3239 0x26EC6
+0x323A 0x26F0B
+0x323B 0x26EA4
+0x323C 0x26E95
+0x323D 0x26EA3
+0x323E 0x26EE2
+0x323F 0x26ECD
+0x3240 0x26EE3
+0x3241 0x26EAB
+0x3242 0x26ECB
+0x3243 0x26E8F
+0x3244 0x2F9AB
+0x3245 0x26EA9
+0x3246 0x26F24
+0x3247 0x26EE4
+0x3248 0x26F12
+0x3249 0x26EE5
+0x324A 0x26F67
+0x324B 0x26EAA
+0x324C 0x26EA0
+0x324D 0x26EE6
+0x324E 0x26EC1
+0x324F 0x26EE7
+0x3250 0x26F0D
+0x3251 0x26E86
+0x3252 0x26EB0
+0x3253 0x26E8B
+0x3254 0x26EE8
+0x3255 0x26EC9
+0x3256 0x26F19
+0x3257 0x26EC0
+0x3258 0x26F0C
+0x3259 0x26EE9
+0x325A 0x26EEA
+0x325B 0x271ED
+0x325C 0x271E3
+0x325D 0x271E4
+0x325E 0x271E8
+0x325F 0x271D2
+0x3260 0x271E2
+0x3262 0x273CF
+0x3263 0x273D1
+0x3264 0x273C3
+0x3265 0x273C9
+0x3266 0x273EA
+0x3267 0x273B4
+0x3268 0x273DC
+0x3269 0x273BD
+0x326A 0x273E6
+0x326B 0x273C8
+0x326C 0x273EC
+0x326D 0x273B2
+0x326E 0x273A9
+0x326F 0x273D3
+0x3270 0x273C0
+0x3271 0x273E9
+0x3272 0x273D5
+0x3274 0x273C5
+0x3276 0x273CB
+0x3277 0x273D0
+0x3278 0x273D2
+0x3279 0x273E4
+0x327A 0x273E8
+0x327B 0x273CD
+0x327C 0x273B6
+0x327D 0x273AA
+0x327E 0x273D4
+0x3321 0x28449
+0x3322 0x273C1
+0x3323 0x273DD
+0x3324 0x273CE
+0x3325 0x275C9
+0x3326 0x275CA
+0x3327 0x276FD
+0x3328 0x276D9
+0x3329 0x276FF
+0x332A 0x27704
+0x332B 0x276FA
+0x332C 0x27706
+0x332D 0x27715
+0x332E 0x27711
+0x332F 0x27707
+0x3330 0x2770B
+0x3331 0x277FC
+0x3332 0x277FD
+0x3333 0x2786D
+0x3334 0x27865
+0x3335 0x27914
+0x3336 0x27913
+0x3337 0x2790C
+0x3338 0x2790B
+0x3339 0x27918
+0x333A 0x27922
+0x333B 0x27A7D
+0x333C 0x27A6F
+0x333D 0x27A75
+0x333E 0x27A7B
+0x333F 0x27A80
+0x3340 0x27A7F
+0x3341 0x27A96
+0x3342 0x27A6D
+0x3343 0x27A6B
+0x3344 0x27A86
+0x3345 0x27A73
+0x3346 0x27A62
+0x3347 0x27A77
+0x3348 0x27A81
+0x3349 0x27A69
+0x334A 0x27A82
+0x334B 0x27A97
+0x334C 0x27A84
+0x334E 0x27A78
+0x334F 0x2F9D0
+0x3350 0x27A7A
+0x3351 0x27A6A
+0x3352 0x27A65
+0x3353 0x27A7E
+0x3354 0x27A94
+0x3355 0x27BC2
+0x3356 0x27BC1
+0x3357 0x27BF9
+0x3358 0x27C71
+0x3359 0x27C6B
+0x335A 0x27C6D
+0x335B 0x27C6F
+0x335C 0x27C6E
+0x335D 0x27CF2
+0x335E 0x27CE8
+0x335F 0x27CEF
+0x3360 0x27CE9
+0x3361 0x27CEA
+0x3362 0x27CED
+0x3363 0x27CF3
+0x3364 0x27CE6
+0x3365 0x27DC9
+0x3366 0x27DB4
+0x3367 0x27DB3
+0x3368 0x27DB9
+0x3369 0x27DCA
+0x336A 0x27DB1
+0x336B 0x27DB6
+0x336C 0x27DC7
+0x336D 0x27DC4
+0x336E 0x27DB7
+0x336F 0x27E6F
+0x3370 0x27F33
+0x3371 0x27F32
+0x3372 0x27F1F
+0x3373 0x2F9D9
+0x3374 0x27F2B
+0x3375 0x27F30
+0x3376 0x27F36
+0x3377 0x27F42
+0x3378 0x27F41
+0x3379 0x2F9D8
+0x337A 0x280A5
+0x337B 0x280AB
+0x337C 0x280A9
+0x337D 0x280B3
+0x337E 0x280A7
+0x3421 0x280A0
+0x3422 0x280D2
+0x3423 0x280A8
+0x3424 0x280B6
+0x3425 0x280AC
+0x3426 0x280AE
+0x3427 0x280E6
+0x3428 0x28265
+0x3429 0x28347
+0x342A 0x28363
+0x342B 0x2834D
+0x342C 0x2835F
+0x342D 0x2834B
+0x342E 0x28360
+0x342F 0x28349
+0x3430 0x28353
+0x3431 0x2F9DF
+0x3433 0x28357
+0x3434 0x2834E
+0x3435 0x28352
+0x3436 0x28354
+0x3437 0x28420
+0x3438 0x28422
+0x3439 0x285C1
+0x343A 0x285D7
+0x343B 0x285D5
+0x343C 0x285C4
+0x343D 0x285D0
+0x343E 0x285BB
+0x343F 0x285E2
+0x3440 0x285CB
+0x3441 0x285B8
+0x3442 0x285BF
+0x3443 0x285D8
+0x3444 0x285C0
+0x3445 0x285BA
+0x3446 0x285B4
+0x3447 0x285BC
+0x3448 0x285D4
+0x3449 0x285ED
+0x344A 0x285C2
+0x344B 0x285D9
+0x344C 0x285CC
+0x344D 0x2872F
+0x344E 0x28723
+0x344F 0x28796
+0x3450 0x2878D
+0x3451 0x2879E
+0x3452 0x28799
+0x3453 0x28883
+0x3455 0x2886A
+0x3456 0x28869
+0x3457 0x28875
+0x3458 0x2886C
+0x3459 0x28880
+0x345A 0x2886E
+0x345B 0x28881
+0x345C 0x28877
+0x345D 0x28876
+0x345E 0x28873
+0x345F 0x28870
+0x3460 0x28884
+0x3461 0x28919
+0x3462 0x289F2
+0x3464 0x289EC
+0x3465 0x289EB
+0x3466 0x289F6
+0x3467 0x289EF
+0x3468 0x289F4
+0x3469 0x289EE
+0x346A 0x289F3
+0x346B 0x289ED
+0x346C 0x28C9B
+0x346D 0x28C98
+0x346E 0x28C94
+0x346F 0x2147A
+0x3470 0x28C9A
+0x3471 0x2F9F0
+0x3472 0x28D4C
+0x3474 0x28D57
+0x3475 0x28D51
+0x3476 0x28D62
+0x3477 0x28D52
+0x3478 0x28D5C
+0x3479 0x28D53
+0x347A 0x2F9EF
+0x347B 0x28E85
+0x347C 0x28F2D
+0x347D 0x28F3E
+0x347E 0x28F30
+0x3521 0x28F7D
+0x3522 0x28FE6
+0x3523 0x28FF6
+0x3524 0x28FE4
+0x3525 0x28FE9
+0x3526 0x28FEC
+0x3527 0x28FF2
+0x3528 0x28FE8
+0x3529 0x28FE3
+0x352A 0x28FEB
+0x352B 0x28FF0
+0x352C 0x28FEA
+0x352D 0x28FE7
+0x352E 0x28FFD
+0x352F 0x28FE5
+0x3530 0x28FEE
+0x3531 0x28FF5
+0x3532 0x28FF9
+0x3533 0x28FF1
+0x3534 0x28FF4
+0x3535 0x2F9F4
+0x3536 0x29011
+0x3537 0x290DE
+0x3538 0x290D8
+0x3539 0x290DD
+0x353A 0x290DB
+0x353B 0x290D3
+0x353C 0x290E1
+0x353D 0x291DE
+0x353E 0x291FC
+0x353F 0x29228
+0x3540 0x292B7
+0x3541 0x292B8
+0x3542 0x292C7
+0x3543 0x292B2
+0x3544 0x292A9
+0x3545 0x292B9
+0x3546 0x292BC
+0x3547 0x292B3
+0x3548 0x292D1
+0x3549 0x293B0
+0x354A 0x293B1
+0x354B 0x293B6
+0x354C 0x29404
+0x354D 0x2942C
+0x354E 0x294C1
+0x354F 0x2949E
+0x3550 0x294BA
+0x3552 0x294D1
+0x3553 0x294D3
+0x3554 0x294D4
+0x3555 0x294D5
+0x3556 0x294C5
+0x3557 0x294B6
+0x3558 0x294B2
+0x3559 0x294B5
+0x355A 0x294C3
+0x355B 0x294B9
+0x355C 0x294C6
+0x355D 0x295D6
+0x355E 0x295E0
+0x355F 0x295DB
+0x3560 0x295D7
+0x3561 0x295DD
+0x3562 0x29715
+0x3563 0x2970C
+0x3564 0x2970F
+0x3565 0x2970E
+0x3566 0x296FE
+0x3567 0x29704
+0x3568 0x2970B
+0x3569 0x29702
+0x356A 0x296FF
+0x356B 0x29708
+0x356C 0x29710
+0x356D 0x29717
+0x356E 0x29713
+0x356F 0x29706
+0x3570 0x29709
+0x3571 0x29824
+0x3572 0x29826
+0x3573 0x29825
+0x3574 0x29848
+0x3575 0x298B5
+0x3576 0x298D2
+0x3577 0x298D5
+0x3578 0x298C4
+0x3579 0x298AF
+0x357A 0x298AD
+0x357B 0x298C1
+0x357C 0x298C0
+0x357D 0x298CC
+0x357E 0x298CD
+0x3621 0x298C3
+0x3622 0x298C8
+0x3623 0x298C5
+0x3624 0x298BA
+0x3625 0x298D0
+0x3626 0x298C2
+0x3627 0x298CE
+0x3629 0x29A43
+0x362A 0x29A42
+0x362B 0x29A40
+0x362C 0x29A31
+0x362D 0x29ACF
+0x362E 0x29ACE
+0x362F 0x29B30
+0x3630 0x29B34
+0x3631 0x29B32
+0x3632 0x29B43
+0x3633 0x29B3C
+0x3634 0x29C11
+0x3635 0x29C35
+0x3636 0x29C34
+0x3637 0x29C37
+0x3638 0x29C31
+0x3639 0x29CBF
+0x363A 0x29CBC
+0x363B 0x29CC2
+0x363C 0x29CC9
+0x363D 0x29D83
+0x363E 0x29D8B
+0x363F 0x29DA0
+0x3640 0x29D8D
+0x3641 0x29D8C
+0x3642 0x29D9A
+0x3643 0x29D8A
+0x3644 0x29D91
+0x3645 0x29FF1
+0x3646 0x2A00F
+0x3647 0x2A001
+0x3648 0x2A007
+0x3649 0x2A00C
+0x364B 0x29FDC
+0x364C 0x29FEE
+0x364D 0x29FF7
+0x364E 0x29FF2
+0x364F 0x29FF8
+0x3650 0x29FEB
+0x3652 0x29FE6
+0x3653 0x29FED
+0x3654 0x29FE9
+0x3655 0x2A008
+0x3656 0x2A000
+0x3657 0x29FE5
+0x3658 0x29FFC
+0x3659 0x2A261
+0x365A 0x2A25E
+0x365B 0x2A25F
+0x365D 0x2A29B
+0x365E 0x2A316
+0x365F 0x2A315
+0x3660 0x2A320
+0x3661 0x2A314
+0x3662 0x2A31A
+0x3663 0x2A317
+0x3664 0x2A39C
+0x3666 0x2A3F1
+0x3668 0x2A3F0
+0x3669 0x2A428
+0x366A 0x2A424
+0x366B 0x2A42A
+0x366C 0x2A42B
+0x366D 0x2A4D5
+0x366E 0x2A504
+0x366F 0x2A505
+0x3670 0x2A591
+0x3671 0x2A592
+0x3672 0x2A6A6
+0x3673 0x20109
+0x3674 0x20422
+0x3675 0x2041A
+0x3676 0x2040E
+0x3677 0x2041B
+0x3678 0x20408
+0x3679 0x250B3
+0x367A 0x2F81C
+0x367B 0x2069D
+0x367C 0x20812
+0x367D 0x2081E
+0x367E 0x208BB
+0x3721 0x208BF
+0x3722 0x208BC
+0x3723 0x20908
+0x3724 0x20909
+0x3725 0x20963
+0x3726 0x209C8
+0x3727 0x23728
+0x3728 0x20B8E
+0x3729 0x20B8D
+0x372A 0x21043
+0x372B 0x2104D
+0x372C 0x2106D
+0x372D 0x21042
+0x372E 0x21052
+0x372F 0x21051
+0x3730 0x21069
+0x3731 0x21050
+0x3732 0x21056
+0x3733 0x2106C
+0x3734 0x21044
+0x3735 0x21045
+0x3736 0x2106B
+0x3738 0x21068
+0x3739 0x21057
+0x373A 0x2122E
+0x373B 0x21231
+0x373C 0x2122D
+0x373D 0x2148B
+0x373E 0x214B2
+0x373F 0x2148D
+0x3740 0x214A3
+0x3741 0x214A4
+0x3742 0x21490
+0x3743 0x21489
+0x3744 0x2148E
+0x3745 0x21492
+0x3746 0x2157B
+0x3747 0x21690
+0x3748 0x2168F
+0x3749 0x218E9
+0x374A 0x218CD
+0x374B 0x218C5
+0x374C 0x218D0
+0x374D 0x218C9
+0x374E 0x218D1
+0x374F 0x218C7
+0x3750 0x218D2
+0x3751 0x2185F
+0x3752 0x218E1
+0x3753 0x218CC
+0x3754 0x218C6
+0x3755 0x218E4
+0x3756 0x219A9
+0x3757 0x21AD3
+0x3758 0x21ADA
+0x3759 0x21AD2
+0x375A 0x21ADB
+0x375B 0x21B4D
+0x375C 0x21B4E
+0x375D 0x21C1C
+0x375E 0x21CE8
+0x375F 0x21F6C
+0x3760 0x21F5F
+0x3761 0x21F66
+0x3762 0x21F64
+0x3763 0x21F78
+0x3764 0x21F65
+0x3765 0x21F6D
+0x3766 0x21F61
+0x3767 0x21F7A
+0x3768 0x22007
+0x3769 0x22166
+0x376A 0x22168
+0x376B 0x22162
+0x376C 0x222D3
+0x376D 0x222D4
+0x376E 0x222D1
+0x376F 0x222DC
+0x3770 0x22373
+0x3771 0x22372
+0x3772 0x2242D
+0x3773 0x2242C
+0x3774 0x2242F
+0x3775 0x22472
+0x3776 0x224B4
+0x3777 0x22589
+0x3778 0x228CD
+0x3779 0x228A6
+0x377A 0x228A2
+0x377B 0x228A0
+0x377C 0x22846
+0x377D 0x228A1
+0x377E 0x26857
+0x3821 0x228A3
+0x3822 0x228B1
+0x3823 0x228DB
+0x3824 0x228F6
+0x3825 0x228DC
+0x3826 0x228D6
+0x3827 0x22A13
+0x3828 0x22D9C
+0x3829 0x22D97
+0x382A 0x22DD8
+0x382B 0x22DE4
+0x382C 0x22DD4
+0x382D 0x22DE5
+0x382E 0x22DDB
+0x382F 0x22DD0
+0x3830 0x22DDA
+0x3831 0x22DCC
+0x3832 0x22DDC
+0x3833 0x22DED
+0x3834 0x22DD3
+0x3835 0x22DD1
+0x3836 0x22DCE
+0x3837 0x22DD9
+0x3838 0x22DDD
+0x3839 0x2F8C6
+0x383A 0x22EE6
+0x383B 0x22EE5
+0x383C 0x22EE9
+0x383D 0x22FFF
+0x383E 0x22FFE
+0x383F 0x2300E
+0x3840 0x2308C
+0x3841 0x230CA
+0x3842 0x230CB
+0x3843 0x2311A
+0x3844 0x232D7
+0x3845 0x232CF
+0x3846 0x232D0
+0x3847 0x232C9
+0x3848 0x232CC
+0x3849 0x232D3
+0x384A 0x233A4
+0x384B 0x233A3
+0x384C 0x23681
+0x384D 0x23726
+0x384E 0x236F3
+0x384F 0x23727
+0x3850 0x236F2
+0x3851 0x236FF
+0x3852 0x236F5
+0x3853 0x236FC
+0x3854 0x2370E
+0x3856 0x236F6
+0x3857 0x23700
+0x3858 0x23723
+0x3859 0x23705
+0x385A 0x23725
+0x385B 0x23708
+0x385C 0x23750
+0x385D 0x23925
+0x385E 0x23920
+0x385F 0x23923
+0x3860 0x23921
+0x3861 0x239A1
+0x3862 0x23A69
+0x3863 0x23A6C
+0x3864 0x23A68
+0x3865 0x23A6B
+0x3866 0x23ACC
+0x3867 0x23ACD
+0x3868 0x23C10
+0x3869 0x23C0D
+0x386A 0x23C0A
+0x386B 0x23C16
+0x386C 0x23C14
+0x386D 0x23C52
+0x386E 0x24028
+0x386F 0x2402E
+0x3870 0x2402C
+0x3871 0x2404D
+0x3872 0x24049
+0x3873 0x24031
+0x3874 0x24030
+0x3875 0x24033
+0x3876 0x2402D
+0x3877 0x24036
+0x3878 0x2403E
+0x3879 0x2402F
+0x387A 0x24027
+0x387B 0x24034
+0x387C 0x2404C
+0x387D 0x243FE
+0x387E 0x24412
+0x3921 0x2441F
+0x3922 0x24417
+0x3923 0x243F5
+0x3924 0x24415
+0x3925 0x243F7
+0x3927 0x21F7D
+0x3928 0x243FA
+0x3929 0x243F9
+0x392A 0x2444B
+0x392B 0x2459C
+0x392C 0x2459D
+0x392E 0x246F0
+0x392F 0x246F6
+0x3930 0x246EF
+0x3931 0x2489D
+0x3932 0x2489A
+0x3933 0x248A7
+0x3934 0x248AF
+0x3935 0x248AA
+0x3936 0x24A64
+0x3937 0x24A86
+0x3938 0x24A75
+0x3939 0x24A70
+0x393A 0x24A84
+0x393B 0x24A6B
+0x393C 0x24A85
+0x393D 0x24A6C
+0x393E 0x24B17
+0x393F 0x24B94
+0x3940 0x24B93
+0x3941 0x24CD2
+0x3942 0x24CD7
+0x3943 0x24CD4
+0x3944 0x24EA6
+0x3945 0x24EA7
+0x3946 0x24E9C
+0x3947 0x24E8B
+0x3948 0x24E8D
+0x3949 0x24E98
+0x394A 0x24EB9
+0x394B 0x24E9B
+0x394C 0x24E9D
+0x394D 0x24E99
+0x394E 0x24EA8
+0x394F 0x24E91
+0x3950 0x24E87
+0x3951 0x24E9A
+0x3952 0x24FA6
+0x3953 0x2501F
+0x3954 0x250A7
+0x3955 0x250B1
+0x3956 0x250B2
+0x3957 0x250B7
+0x3958 0x252D0
+0x3959 0x252B3
+0x395A 0x252B5
+0x395B 0x252C4
+0x395C 0x252C3
+0x395D 0x252BC
+0x395E 0x252B2
+0x395F 0x252BA
+0x3960 0x252BB
+0x3961 0x252C2
+0x3962 0x252CD
+0x3963 0x252BE
+0x3964 0x252B7
+0x3965 0x2538F
+0x3966 0x25403
+0x3967 0x25404
+0x3968 0x25571
+0x3969 0x25577
+0x396A 0x25574
+0x396B 0x2558B
+0x396C 0x2557A
+0x396D 0x2F951
+0x396E 0x2558C
+0x396F 0x25573
+0x3970 0x256FF
+0x3971 0x256FB
+0x3972 0x256FD
+0x3973 0x256F0
+0x3974 0x256F3
+0x3975 0x256FC
+0x3976 0x256F2
+0x3977 0x25892
+0x3978 0x2589E
+0x3979 0x258AE
+0x397A 0x25896
+0x397B 0x25A14
+0x397C 0x25A12
+0x397D 0x25A13
+0x397E 0x25A16
+0x3A21 0x25A0F
+0x3A22 0x25AB6
+0x3A23 0x25ABD
+0x3A24 0x25C8C
+0x3A25 0x25CAE
+0x3A26 0x25CAC
+0x3A27 0x25CAB
+0x3A28 0x25C99
+0x3A29 0x25C92
+0x3A2A 0x25CBB
+0x3A2B 0x25C9E
+0x3A2C 0x25C7E
+0x3A2D 0x25CAF
+0x3A2E 0x25CBC
+0x3A2F 0x25C98
+0x3A30 0x25F01
+0x3A31 0x25F09
+0x3A32 0x25F06
+0x3A33 0x2F967
+0x3A34 0x25F07
+0x3A35 0x25F08
+0x3A36 0x260CF
+0x3A37 0x2610E
+0x3A38 0x26132
+0x3A3A 0x26112
+0x3A3B 0x26116
+0x3A3C 0x26117
+0x3A3D 0x2611B
+0x3A3E 0x26115
+0x3A3F 0x26131
+0x3A40 0x26118
+0x3A41 0x2611A
+0x3A42 0x26110
+0x3A43 0x2610A
+0x3A44 0x26109
+0x3A45 0x2624F
+0x3A46 0x2F973
+0x3A47 0x2630F
+0x3A48 0x26310
+0x3A49 0x2F975
+0x3A4A 0x26328
+0x3A4B 0x26311
+0x3A4C 0x26316
+0x3A4D 0x26317
+0x3A4E 0x26302
+0x3A4F 0x263BB
+0x3A50 0x263BA
+0x3A51 0x263C3
+0x3A52 0x263BC
+0x3A53 0x2648A
+0x3A54 0x26484
+0x3A55 0x26486
+0x3A56 0x264E0
+0x3A57 0x26517
+0x3A58 0x26518
+0x3A59 0x2651E
+0x3A5A 0x26515
+0x3A5B 0x265D3
+0x3A5C 0x265DA
+0x3A5D 0x265D9
+0x3A5E 0x267E6
+0x3A5F 0x267F4
+0x3A60 0x267E1
+0x3A61 0x26869
+0x3A62 0x26840
+0x3A63 0x26858
+0x3A64 0x2686C
+0x3A65 0x2684D
+0x3A66 0x26921
+0x3A67 0x26999
+0x3A68 0x269F1
+0x3A69 0x23F68
+0x3A6A 0x26A86
+0x3A6B 0x26F5B
+0x3A6C 0x26F5C
+0x3A6D 0x26F77
+0x3A6E 0x26F2C
+0x3A6F 0x2F9AD
+0x3A70 0x26F58
+0x3A71 0x26F64
+0x3A72 0x26F61
+0x3A73 0x26F48
+0x3A74 0x26F97
+0x3A75 0x26F59
+0x3A76 0x26F29
+0x3A77 0x26F62
+0x3A78 0x26F2E
+0x3A79 0x26F68
+0x3A7A 0x26F90
+0x3A7B 0x26F3A
+0x3A7C 0x26F3D
+0x3A7D 0x26F5E
+0x3A7E 0x26F46
+0x3B21 0x26F69
+0x3B22 0x26F65
+0x3B23 0x26F3E
+0x3B24 0x26F49
+0x3B25 0x26F56
+0x3B26 0x26FE1
+0x3B27 0x26F78
+0x3B28 0x26F79
+0x3B29 0x26F66
+0x3B2A 0x26F4A
+0x3B2B 0x26F35
+0x3B2C 0x26F7A
+0x3B2D 0x26F92
+0x3B2E 0x26F60
+0x3B2F 0x26F36
+0x3B30 0x26F51
+0x3B31 0x26F42
+0x3B33 0x26F3F
+0x3B34 0x26F7B
+0x3B35 0x26F5D
+0x3B36 0x26F94
+0x3B37 0x26F6A
+0x3B38 0x2F9B5
+0x3B39 0x271F2
+0x3B3A 0x273BB
+0x3B3B 0x2741B
+0x3B3C 0x2741A
+0x3B3D 0x27433
+0x3B3E 0x27417
+0x3B3F 0x2740A
+0x3B40 0x27415
+0x3B41 0x27412
+0x3B42 0x27401
+0x3B43 0x2742D
+0x3B44 0x273FD
+0x3B45 0x27423
+0x3B46 0x27405
+0x3B47 0x27411
+0x3B48 0x27400
+0x3B49 0x2741C
+0x3B4A 0x27435
+0x3B4B 0x2742E
+0x3B4C 0x27436
+0x3B4D 0x20ABF
+0x3B4E 0x2742F
+0x3B4F 0x2740C
+0x3B50 0x27409
+0x3B51 0x27431
+0x3B52 0x273FC
+0x3B53 0x2740F
+0x3B54 0x27418
+0x3B55 0x27402
+0x3B56 0x27600
+0x3B57 0x2771F
+0x3B58 0x27737
+0x3B5A 0x27738
+0x3B5B 0x2772B
+0x3B5C 0x2772E
+0x3B5D 0x27721
+0x3B5E 0x27730
+0x3B5F 0x27729
+0x3B60 0x27731
+0x3B61 0x2F9C9
+0x3B62 0x27701
+0x3B63 0x2772C
+0x3B64 0x27722
+0x3B65 0x277FF
+0x3B66 0x27877
+0x3B67 0x27867
+0x3B68 0x2787F
+0x3B69 0x2787D
+0x3B6A 0x2787B
+0x3B6B 0x2787E
+0x3B6C 0x2791E
+0x3B6D 0x2791C
+0x3B6E 0x27921
+0x3B6F 0x27926
+0x3B70 0x27927
+0x3B71 0x27929
+0x3B72 0x2792C
+0x3B73 0x2791D
+0x3B74 0x2792B
+0x3B75 0x27ABF
+0x3B76 0x27AA4
+0x3B77 0x27AAA
+0x3B78 0x27AAE
+0x3B79 0x27A9F
+0x3B7A 0x27AD0
+0x3B7B 0x27AB1
+0x3B7C 0x27AAD
+0x3B7D 0x27A9B
+0x3B7E 0x27AB2
+0x3C21 0x27AA9
+0x3C22 0x27AB3
+0x3C23 0x27AB4
+0x3C24 0x27ABA
+0x3C25 0x27AA5
+0x3C26 0x27AB7
+0x3C27 0x27AAC
+0x3C28 0x27ACB
+0x3C29 0x27ACF
+0x3C2A 0x27BC6
+0x3C2B 0x27C01
+0x3C2C 0x27BFF
+0x3C2D 0x27BFD
+0x3C2E 0x27C77
+0x3C2F 0x27C78
+0x3C30 0x27C76
+0x3C31 0x27CF7
+0x3C32 0x27DCC
+0x3C34 0x27DD4
+0x3C35 0x27DD7
+0x3C36 0x27DD5
+0x3C37 0x27DD6
+0x3C38 0x27DD3
+0x3C39 0x27F5D
+0x3C3A 0x27F55
+0x3C3B 0x280E0
+0x3C3C 0x28148
+0x3C3D 0x280EE
+0x3C3E 0x280DB
+0x3C3F 0x280E7
+0x3C40 0x280D6
+0x3C41 0x280E5
+0x3C42 0x280E1
+0x3C43 0x280DD
+0x3C44 0x280E2
+0x3C45 0x28270
+0x3C46 0x28266
+0x3C47 0x2826F
+0x3C48 0x2826E
+0x3C49 0x28381
+0x3C4A 0x28369
+0x3C4B 0x2836E
+0x3C4C 0x2836D
+0x3C4D 0x2836C
+0x3C4E 0x28384
+0x3C4F 0x28385
+0x3C50 0x28371
+0x3C51 0x28373
+0x3C52 0x2836A
+0x3C53 0x2836F
+0x3C54 0x2837B
+0x3C55 0x2856A
+0x3C56 0x2857C
+0x3C57 0x2857D
+0x3C58 0x28581
+0x3C59 0x285FA
+0x3C5A 0x28605
+0x3C5B 0x285EB
+0x3C5C 0x285FB
+0x3C5D 0x285E9
+0x3C5E 0x285EF
+0x3C5F 0x285FC
+0x3C60 0x285E7
+0x3C61 0x2F9E1
+0x3C62 0x285EE
+0x3C63 0x285FD
+0x3C64 0x28732
+0x3C65 0x287A7
+0x3C66 0x287B5
+0x3C67 0x287B1
+0x3C68 0x287B9
+0x3C69 0x287A8
+0x3C6A 0x287B3
+0x3C6B 0x2F9E6
+0x3C6C 0x2888A
+0x3C6D 0x28891
+0x3C6E 0x2888D
+0x3C6F 0x28899
+0x3C71 0x2889A
+0x3C72 0x2889B
+0x3C73 0x28892
+0x3C74 0x2888F
+0x3C75 0x288AB
+0x3C76 0x24CDB
+0x3C78 0x28A75
+0x3C79 0x28A31
+0x3C7A 0x28A38
+0x3C7C 0x28A35
+0x3C7D 0x28A69
+0x3C7E 0x28A3B
+0x3D21 0x28A3D
+0x3D22 0x28A6C
+0x3D23 0x28A79
+0x3D24 0x28A3C
+0x3D25 0x28A3E
+0x3D26 0x28C97
+0x3D27 0x28CA5
+0x3D28 0x28CA2
+0x3D29 0x28C9D
+0x3D2A 0x28CA1
+0x3D2B 0x28D68
+0x3D2C 0x28D6F
+0x3D2D 0x28D6D
+0x3D2E 0x28D72
+0x3D2F 0x28D75
+0x3D30 0x28D77
+0x3D31 0x28D79
+0x3D32 0x28EB5
+0x3D33 0x28EEA
+0x3D34 0x28EAB
+0x3D35 0x28F43
+0x3D36 0x28F41
+0x3D37 0x28F42
+0x3D38 0x29009
+0x3D39 0x29008
+0x3D3A 0x29006
+0x3D3B 0x29001
+0x3D3C 0x29003
+0x3D3D 0x29000
+0x3D3E 0x29004
+0x3D3F 0x2900A
+0x3D40 0x2900E
+0x3D41 0x2900D
+0x3D42 0x29007
+0x3D43 0x2900F
+0x3D44 0x29014
+0x3D45 0x29002
+0x3D46 0x29015
+0x3D47 0x2900C
+0x3D48 0x29010
+0x3D49 0x29005
+0x3D4A 0x290FD
+0x3D4B 0x290FF
+0x3D4C 0x29104
+0x3D4D 0x29100
+0x3D4E 0x29109
+0x3D4F 0x2922B
+0x3D50 0x2F9F7
+0x3D51 0x29231
+0x3D52 0x292DB
+0x3D53 0x292C5
+0x3D54 0x292D3
+0x3D55 0x292CE
+0x3D57 0x292C9
+0x3D58 0x292BF
+0x3D59 0x292CB
+0x3D5A 0x292C0
+0x3D5B 0x292D0
+0x3D5C 0x292D4
+0x3D5D 0x293C1
+0x3D5E 0x293B9
+0x3D5F 0x293BB
+0x3D60 0x293C3
+0x3D61 0x293C9
+0x3D62 0x29407
+0x3D63 0x2942D
+0x3D64 0x294F8
+0x3D65 0x294E1
+0x3D66 0x294FA
+0x3D67 0x294EF
+0x3D68 0x294FD
+0x3D6A 0x294EB
+0x3D6B 0x294F1
+0x3D6C 0x294ED
+0x3D6D 0x294FE
+0x3D6E 0x295F8
+0x3D6F 0x29603
+0x3D70 0x295EE
+0x3D71 0x295E8
+0x3D72 0x29601
+0x3D73 0x296EC
+0x3D74 0x29722
+0x3D75 0x29714
+0x3D76 0x29734
+0x3D77 0x2972F
+0x3D78 0x29739
+0x3D79 0x29741
+0x3D7A 0x2973C
+0x3D7B 0x29749
+0x3D7C 0x29758
+0x3D7D 0x2973A
+0x3D7E 0x29742
+0x3E21 0x2973F
+0x3E22 0x29822
+0x3E23 0x29823
+0x3E24 0x2984A
+0x3E25 0x298DC
+0x3E26 0x298D9
+0x3E27 0x298DB
+0x3E28 0x298E2
+0x3E29 0x2FA07
+0x3E2A 0x298DF
+0x3E2B 0x298E0
+0x3E2C 0x298D7
+0x3E2D 0x29A4F
+0x3E2E 0x29A46
+0x3E2F 0x29A53
+0x3E30 0x29A55
+0x3E31 0x29A4E
+0x3E32 0x29A4A
+0x3E33 0x29A4C
+0x3E34 0x29A63
+0x3E35 0x29B51
+0x3E36 0x29B53
+0x3E37 0x29B58
+0x3E38 0x29B4D
+0x3E39 0x29B5A
+0x3E3A 0x29B49
+0x3E3B 0x29B5D
+0x3E3C 0x29C12
+0x3E3D 0x29C3C
+0x3E3E 0x29CD1
+0x3E3F 0x29CDF
+0x3E40 0x29CD6
+0x3E41 0x29CD8
+0x3E42 0x29CE0
+0x3E43 0x29CD9
+0x3E44 0x29DB1
+0x3E45 0x29DAC
+0x3E46 0x29DAA
+0x3E47 0x29DEE
+0x3E48 0x29DBD
+0x3E4A 0x29DC3
+0x3E4B 0x29DA8
+0x3E4C 0x29DAE
+0x3E4D 0x29DAB
+0x3E4E 0x2A01D
+0x3E4F 0x2A027
+0x3E50 0x2A038
+0x3E51 0x2A012
+0x3E52 0x2A048
+0x3E53 0x2A02B
+0x3E54 0x2A016
+0x3E55 0x2A019
+0x3E56 0x2A03D
+0x3E57 0x2A023
+0x3E58 0x2A02A
+0x3E59 0x2A264
+0x3E5A 0x2A2AD
+0x3E5B 0x2A2AC
+0x3E5C 0x2FA14
+0x3E5D 0x2A2B1
+0x3E5E 0x2A2AF
+0x3E5F 0x2A32C
+0x3E60 0x2A324
+0x3E61 0x2A325
+0x3E62 0x2A328
+0x3E63 0x2A3F9
+0x3E64 0x2A3F7
+0x3E65 0x2A3FD
+0x3E66 0x2A3FE
+0x3E67 0x2A439
+0x3E68 0x2A433
+0x3E69 0x2A4D7
+0x3E6A 0x2A4D8
+0x3E6B 0x2A4E4
+0x3E6C 0x214A1
+0x3E6D 0x2A50E
+0x3E6E 0x2A53B
+0x3E6F 0x2A544
+0x3E70 0x2A542
+0x3E71 0x2A594
+0x3E72 0x2A593
+0x3E73 0x2A5D5
+0x3E74 0x2A6A7
+0x3E75 0x20431
+0x3E76 0x20423
+0x3E77 0x20428
+0x3E78 0x20427
+0x3E79 0x204C6
+0x3E7A 0x205A3
+0x3E7B 0x20621
+0x3E7C 0x2081B
+0x3E7E 0x208C1
+0x3F21 0x208C3
+0x3F22 0x2092A
+0x3F23 0x20969
+0x3F24 0x20A27
+0x3F25 0x210B6
+0x3F26 0x210A7
+0x3F27 0x210A4
+0x3F28 0x210A6
+0x3F29 0x21090
+0x3F2A 0x2109E
+0x3F2B 0x21094
+0x3F2C 0x210A8
+0x3F2D 0x210A5
+0x3F2E 0x210A2
+0x3F2F 0x21091
+0x3F31 0x214BC
+0x3F32 0x214BD
+0x3F33 0x214B4
+0x3F34 0x214B0
+0x3F35 0x214E4
+0x3F36 0x21545
+0x3F37 0x2154B
+0x3F38 0x2157E
+0x3F39 0x2157F
+0x3F3A 0x2157D
+0x3F3B 0x215C3
+0x3F3C 0x218FC
+0x3F3D 0x218F7
+0x3F3E 0x218F0
+0x3F3F 0x218ED
+0x3F40 0x218F1
+0x3F41 0x218F8
+0x3F42 0x21AE9
+0x3F43 0x21CEB
+0x3F45 0x21F90
+0x3F46 0x21F8D
+0x3F47 0x21F86
+0x3F48 0x21F91
+0x3F49 0x21F8A
+0x3F4A 0x22008
+0x3F4B 0x22050
+0x3F4C 0x222EA
+0x3F4D 0x222E6
+0x3F4E 0x222E2
+0x3F4F 0x222E7
+0x3F50 0x222ED
+0x3F51 0x222E1
+0x3F52 0x22434
+0x3F53 0x22476
+0x3F54 0x22475
+0x3F55 0x22473
+0x3F56 0x224B5
+0x3F57 0x22590
+0x3F58 0x22592
+0x3F59 0x228E1
+0x3F5A 0x228DF
+0x3F5B 0x228D5
+0x3F5C 0x228F2
+0x3F5D 0x228FE
+0x3F5E 0x22913
+0x3F5F 0x2292E
+0x3F60 0x22A19
+0x3F61 0x22E08
+0x3F63 0x22E05
+0x3F64 0x22E09
+0x3F65 0x22E06
+0x3F66 0x22E03
+0x3F67 0x22DFD
+0x3F68 0x22DFC
+0x3F69 0x22E02
+0x3F6A 0x22E42
+0x3F6B 0x2301A
+0x3F6C 0x23011
+0x3F6D 0x23015
+0x3F6E 0x23016
+0x3F6F 0x230CC
+0x3F70 0x230CF
+0x3F71 0x230D0
+0x3F72 0x23122
+0x3F73 0x2311E
+0x3F74 0x23121
+0x3F75 0x232E5
+0x3F77 0x23354
+0x3F78 0x232EF
+0x3F79 0x23353
+0x3F7A 0x23351
+0x3F7B 0x233AD
+0x3F7C 0x23767
+0x3F7D 0x23768
+0x3F7E 0x237A4
+0x4021 0x23777
+0x4022 0x23789
+0x4023 0x23744
+0x4024 0x2378B
+0x4025 0x23779
+0x4026 0x2375B
+0x4027 0x23743
+0x4028 0x23757
+0x4029 0x2374A
+0x402A 0x2377C
+0x402B 0x23746
+0x402C 0x2377B
+0x402D 0x23756
+0x402E 0x239A8
+0x402F 0x23A76
+0x4030 0x23A72
+0x4031 0x23AD6
+0x4032 0x23AD8
+0x4033 0x23AD1
+0x4034 0x23C22
+0x4035 0x23C20
+0x4036 0x23C23
+0x4037 0x23C1E
+0x4038 0x23C6E
+0x4039 0x240A3
+0x403A 0x24077
+0x403B 0x240A6
+0x403C 0x2406D
+0x403D 0x240A2
+0x403E 0x2407C
+0x403F 0x24084
+0x4040 0x24068
+0x4041 0x24074
+0x4042 0x24086
+0x4043 0x240A5
+0x4044 0x2407B
+0x4045 0x2407A
+0x4046 0x24069
+0x4047 0x24072
+0x4048 0x24076
+0x4049 0x2444A
+0x404A 0x24437
+0x404B 0x2442A
+0x404C 0x2442D
+0x404D 0x24446
+0x404E 0x24428
+0x404F 0x24426
+0x4050 0x24442
+0x4051 0x2442C
+0x4052 0x24438
+0x4053 0x2442B
+0x4054 0x24433
+0x4055 0x24445
+0x4056 0x24539
+0x4057 0x246F9
+0x4058 0x246FA
+0x4059 0x248B8
+0x405A 0x248B7
+0x405B 0x248BB
+0x405C 0x248B9
+0x405D 0x248B4
+0x405E 0x24A6F
+0x405F 0x24A87
+0x4060 0x24A8F
+0x4061 0x24AA2
+0x4062 0x24AA3
+0x4063 0x2F931
+0x4064 0x24B9B
+0x4065 0x24B9D
+0x4066 0x24BCE
+0x4068 0x24EBD
+0x4069 0x24EBF
+0x406A 0x24E92
+0x406C 0x24EEF
+0x406D 0x24EC9
+0x406E 0x24FA4
+0x406F 0x24FA8
+0x4070 0x24FAA
+0x4071 0x25028
+0x4072 0x25024
+0x4073 0x25025
+0x4074 0x25026
+0x4075 0x250A9
+0x4076 0x250BA
+0x4077 0x250BE
+0x4078 0x250BC
+0x4079 0x250C0
+0x407A 0x252F0
+0x407B 0x252DF
+0x407C 0x252E0
+0x407D 0x252ED
+0x407E 0x252DB
+0x4121 0x252FB
+0x4122 0x252B9
+0x4123 0x252DA
+0x4124 0x252EB
+0x4125 0x252EC
+0x4126 0x2559A
+0x4127 0x2559F
+0x4128 0x2559B
+0x4129 0x25597
+0x412A 0x255A1
+0x412B 0x2570F
+0x412C 0x25705
+0x412D 0x25748
+0x412F 0x258BC
+0x4130 0x258BA
+0x4131 0x25ABF
+0x4132 0x25D01
+0x4133 0x25CE8
+0x4134 0x25CEF
+0x4135 0x25CE4
+0x4136 0x25CE6
+0x4137 0x25D02
+0x4138 0x25CEB
+0x4139 0x25CE0
+0x413A 0x25CED
+0x413B 0x25CD9
+0x413C 0x2F964
+0x413D 0x25D14
+0x413E 0x25CEE
+0x4140 0x25D13
+0x4141 0x25CF9
+0x4142 0x25CF8
+0x4143 0x25F25
+0x4144 0x2F969
+0x4145 0x25F19
+0x4146 0x25F20
+0x4147 0x25F43
+0x4148 0x25F3F
+0x4149 0x26145
+0x414A 0x2614C
+0x414B 0x26149
+0x414C 0x2614F
+0x414D 0x26141
+0x414E 0x2613E
+0x414F 0x2614D
+0x4150 0x26152
+0x4151 0x2614A
+0x4152 0x2614E
+0x4153 0x26173
+0x4154 0x26142
+0x4155 0x26151
+0x4156 0x26155
+0x4157 0x26150
+0x4158 0x2616C
+0x415A 0x2616A
+0x415B 0x26153
+0x415C 0x26168
+0x415D 0x26255
+0x415E 0x26256
+0x415F 0x2631C
+0x4160 0x2631D
+0x4162 0x2631E
+0x4163 0x26323
+0x4164 0x2631F
+0x4165 0x263E1
+0x4166 0x263CD
+0x4167 0x263CB
+0x4168 0x263CC
+0x4169 0x263C8
+0x416A 0x263C9
+0x416B 0x2649B
+0x416C 0x26494
+0x416D 0x26492
+0x416E 0x26496
+0x416F 0x26493
+0x4170 0x26495
+0x4171 0x2648F
+0x4172 0x2651D
+0x4173 0x26522
+0x4174 0x26521
+0x4175 0x265E9
+0x4176 0x265EF
+0x4177 0x265E0
+0x4178 0x265E6
+0x4179 0x265E4
+0x417A 0x26829
+0x417B 0x2682C
+0x417C 0x26876
+0x417D 0x26883
+0x417E 0x26878
+0x4221 0x2683C
+0x4222 0x24443
+0x4223 0x2687A
+0x4225 0x268F2
+0x4226 0x2699E
+0x4227 0x2699B
+0x4228 0x2699A
+0x4229 0x269F6
+0x422A 0x269F5
+0x422B 0x26AA5
+0x422C 0x26A93
+0x422D 0x26AA4
+0x422E 0x26E82
+0x422F 0x26EC7
+0x4230 0x26FB7
+0x4231 0x2701D
+0x4232 0x26FE2
+0x4233 0x26FD7
+0x4234 0x26FE3
+0x4235 0x26FE4
+0x4236 0x26FBC
+0x4237 0x26FD3
+0x4239 0x26F5A
+0x423A 0x26FD2
+0x423B 0x26F2D
+0x423C 0x2F9AF
+0x423D 0x26FC4
+0x423E 0x26FD0
+0x423F 0x26FE5
+0x4240 0x27005
+0x4241 0x27007
+0x4242 0x26FE6
+0x4243 0x2701B
+0x4244 0x26FE7
+0x4245 0x26FD8
+0x4246 0x26FBE
+0x4247 0x27017
+0x4248 0x26FB4
+0x4249 0x26FD9
+0x424A 0x26FE8
+0x424B 0x26FAD
+0x424C 0x26FAF
+0x424D 0x26FC8
+0x424E 0x26FE9
+0x424F 0x26FEA
+0x4250 0x271FE
+0x4251 0x271FB
+0x4252 0x27200
+0x4253 0x27472
+0x4254 0x27470
+0x4255 0x27446
+0x4256 0x27459
+0x4257 0x2745E
+0x4258 0x27448
+0x4259 0x2744F
+0x425A 0x27471
+0x425B 0x27460
+0x425C 0x2745F
+0x425D 0x2746E
+0x425E 0x27473
+0x425F 0x2F9C0
+0x4260 0x2F9BF
+0x4261 0x27447
+0x4262 0x2746D
+0x4263 0x2746F
+0x4264 0x27481
+0x4265 0x2746C
+0x4266 0x27478
+0x4267 0x27483
+0x4268 0x27449
+0x4269 0x27468
+0x426A 0x27474
+0x426B 0x27463
+0x426C 0x2746A
+0x426D 0x26885
+0x426E 0x27465
+0x426F 0x27462
+0x4270 0x274C8
+0x4271 0x275D0
+0x4272 0x275D4
+0x4273 0x275D1
+0x4274 0x27603
+0x4275 0x27742
+0x4276 0x27763
+0x4277 0x27756
+0x4278 0x2775B
+0x4279 0x27755
+0x427A 0x27750
+0x427B 0x2772D
+0x427C 0x27744
+0x427D 0x27748
+0x427E 0x27745
+0x4321 0x27782
+0x4323 0x27762
+0x4324 0x27885
+0x4325 0x2788D
+0x4326 0x27936
+0x4327 0x2792F
+0x4328 0x27931
+0x4329 0x27937
+0x432A 0x27AA7
+0x432B 0x27AD9
+0x432C 0x27AF0
+0x432D 0x27AF2
+0x432E 0x27AFD
+0x432F 0x27AE8
+0x4330 0x27AEB
+0x4331 0x27AEE
+0x4332 0x27AE0
+0x4333 0x27AE9
+0x4334 0x27AED
+0x4335 0x27AD6
+0x4336 0x27AF8
+0x4337 0x27AD4
+0x4338 0x27ADF
+0x4339 0x27AE7
+0x433A 0x27AD8
+0x433B 0x27AE3
+0x433C 0x27AEF
+0x433D 0x27B0F
+0x433E 0x27BCA
+0x433F 0x21546
+0x4340 0x27C05
+0x4341 0x27C0C
+0x4342 0x27C0D
+0x4343 0x27C7F
+0x4344 0x27C80
+0x4345 0x27C81
+0x4346 0x27D01
+0x4347 0x27D03
+0x4348 0x27DF2
+0x4349 0x27DE2
+0x434A 0x27DE3
+0x434B 0x27DDE
+0x434C 0x27DE9
+0x434D 0x27DE8
+0x434E 0x27DE0
+0x434F 0x27E01
+0x4350 0x27DF5
+0x4351 0x27DE4
+0x4353 0x27E77
+0x4354 0x27F74
+0x4355 0x27F6F
+0x4356 0x27F62
+0x4357 0x27F61
+0x4358 0x27F6D
+0x4359 0x27F73
+0x435A 0x27F6A
+0x435B 0x27F69
+0x435C 0x28112
+0x435D 0x2812D
+0x435E 0x28114
+0x435F 0x2810F
+0x4360 0x28129
+0x4361 0x28116
+0x4362 0x28103
+0x4363 0x28146
+0x4364 0x2815C
+0x4365 0x28111
+0x4366 0x28106
+0x4367 0x280DC
+0x4368 0x2812B
+0x4369 0x2812A
+0x436A 0x2812C
+0x436B 0x28127
+0x436C 0x2827A
+0x436D 0x2839C
+0x436E 0x28399
+0x436F 0x28395
+0x4370 0x2838B
+0x4371 0x28398
+0x4372 0x28396
+0x4373 0x28432
+0x4374 0x285A4
+0x4375 0x285AA
+0x4376 0x2861B
+0x4378 0x2860D
+0x4379 0x2861C
+0x437A 0x2860A
+0x437B 0x28620
+0x437C 0x28608
+0x437D 0x2861A
+0x437E 0x28613
+0x4421 0x28611
+0x4422 0x2875D
+0x4423 0x2875F
+0x4424 0x2875E
+0x4425 0x28760
+0x4426 0x287BB
+0x4427 0x287BC
+0x4428 0x287C1
+0x4429 0x287C0
+0x442A 0x287C8
+0x442B 0x287CE
+0x442C 0x288A7
+0x442D 0x288B2
+0x442E 0x288B6
+0x442F 0x288A5
+0x4430 0x288BA
+0x4431 0x288B5
+0x4432 0x288AD
+0x4433 0x288A4
+0x4434 0x288D3
+0x4435 0x288B0
+0x4436 0x288B1
+0x4437 0x2891D
+0x4438 0x28A8D
+0x443A 0x28A91
+0x443B 0x28AB6
+0x443C 0x28AB7
+0x443D 0x28ABD
+0x443E 0x28ABC
+0x443F 0x28A96
+0x4440 0x28A94
+0x4441 0x28AA0
+0x4442 0x28CA8
+0x4443 0x28CA6
+0x4444 0x28D84
+0x4445 0x28D96
+0x4446 0x28D88
+0x4447 0x28D9A
+0x4448 0x28ED1
+0x4449 0x28ECF
+0x444A 0x28F50
+0x444B 0x28F51
+0x444C 0x28F4E
+0x444D 0x28F80
+0x444E 0x28F81
+0x444F 0x2901B
+0x4450 0x29017
+0x4451 0x29020
+0x4452 0x29019
+0x4453 0x2901A
+0x4454 0x29021
+0x4455 0x2901E
+0x4456 0x29018
+0x4457 0x2901D
+0x4459 0x2912D
+0x445A 0x29124
+0x445B 0x29127
+0x445C 0x2912E
+0x445D 0x29125
+0x445E 0x2911C
+0x445F 0x29119
+0x4461 0x29123
+0x4462 0x2911F
+0x4463 0x2911A
+0x4464 0x2912B
+0x4465 0x2911E
+0x4466 0x291E0
+0x4467 0x29233
+0x4468 0x292E6
+0x4469 0x292FC
+0x446A 0x292E5
+0x446B 0x292F8
+0x446C 0x292F6
+0x446D 0x292EA
+0x446E 0x292F2
+0x446F 0x292ED
+0x4470 0x292EB
+0x4471 0x292F0
+0x4472 0x292F1
+0x4473 0x293C6
+0x4474 0x293C8
+0x4475 0x293CE
+0x4476 0x293C5
+0x4478 0x293CB
+0x4479 0x29513
+0x447A 0x29514
+0x447B 0x29507
+0x447C 0x2950C
+0x447D 0x2961A
+0x4521 0x29617
+0x4522 0x29606
+0x4523 0x29616
+0x4524 0x29607
+0x4525 0x29610
+0x4526 0x29609
+0x4527 0x29619
+0x4528 0x29615
+0x4529 0x2976E
+0x452A 0x2973B
+0x452B 0x2973E
+0x452C 0x2976C
+0x452D 0x29765
+0x452E 0x29764
+0x452F 0x29759
+0x4530 0x2977C
+0x4531 0x29770
+0x4532 0x29779
+0x4533 0x2982C
+0x4534 0x29852
+0x4535 0x29851
+0x4536 0x2984C
+0x4537 0x29900
+0x4538 0x29910
+0x4539 0x29913
+0x453A 0x298FF
+0x453B 0x298FE
+0x453C 0x298ED
+0x453D 0x29A5A
+0x453E 0x29A58
+0x453F 0x29A5C
+0x4540 0x29ADA
+0x4541 0x29B78
+0x4542 0x29B5E
+0x4543 0x29B67
+0x4544 0x29B64
+0x4545 0x29C13
+0x4546 0x29C23
+0x4547 0x29C41
+0x4548 0x29C3F
+0x4549 0x29C40
+0x454A 0x29CED
+0x454B 0x29CE3
+0x454C 0x29CEA
+0x454D 0x29CF0
+0x454E 0x29CE6
+0x454F 0x29CE9
+0x4550 0x29CF1
+0x4551 0x29CEE
+0x4552 0x29DD4
+0x4553 0x29DD1
+0x4554 0x29DDC
+0x4555 0x29DEC
+0x4556 0x2A069
+0x4557 0x2A06D
+0x4558 0x2A057
+0x4559 0x2A066
+0x455A 0x2A0F9
+0x455B 0x2A04A
+0x455C 0x2A060
+0x455D 0x2A056
+0x455E 0x2A059
+0x455F 0x2A04C
+0x4560 0x2A06A
+0x4561 0x2A062
+0x4562 0x2A063
+0x4563 0x2A070
+0x4564 0x2A05F
+0x4565 0x2FA0D
+0x4566 0x2A064
+0x4567 0x2A05D
+0x4568 0x2A068
+0x4569 0x2A09F
+0x456A 0x2A2BA
+0x456B 0x2A2B8
+0x456C 0x2A2BC
+0x456D 0x2A2B9
+0x456E 0x2A2B4
+0x456F 0x2A33B
+0x4570 0x2A32D
+0x4571 0x2A338
+0x4572 0x2A32F
+0x4573 0x2A332
+0x4574 0x2A441
+0x4575 0x2A4CB
+0x4576 0x2A4DE
+0x4577 0x2A4DD
+0x4578 0x2A4DA
+0x4579 0x2A4DC
+0x457A 0x2A510
+0x457B 0x2A54F
+0x457C 0x2A549
+0x457D 0x2A598
+0x457E 0x2A596
+0x4621 0x2A597
+0x4622 0x2A5C7
+0x4623 0x2019C
+0x4624 0x2A5DA
+0x4625 0x2A5D8
+0x4626 0x2A6A8
+0x4627 0x2010A
+0x4628 0x2019D
+0x4629 0x204CB
+0x462A 0x20538
+0x462B 0x20539
+0x462C 0x205A6
+0x462D 0x20823
+0x462E 0x20822
+0x462F 0x20821
+0x4630 0x209CE
+0x4631 0x20B92
+0x4632 0x20B91
+0x4633 0x210EC
+0x4634 0x210E0
+0x4635 0x210ED
+0x4636 0x21108
+0x4637 0x210E5
+0x4638 0x210EE
+0x4639 0x210E4
+0x463A 0x210EB
+0x463B 0x210E3
+0x463C 0x210EA
+0x463D 0x2110A
+0x463E 0x2F859
+0x463F 0x214D1
+0x4640 0x214E3
+0x4641 0x214D4
+0x4642 0x214D0
+0x4643 0x214D9
+0x4646 0x214DA
+0x4647 0x214D3
+0x4648 0x2154C
+0x4649 0x2154D
+0x464A 0x2157C
+0x464B 0x21580
+0x464C 0x215CC
+0x464D 0x218FF
+0x464E 0x21908
+0x464F 0x2A508
+0x4650 0x21901
+0x4651 0x2F86B
+0x4652 0x21900
+0x4653 0x21AED
+0x4654 0x21AF3
+0x4655 0x21AEE
+0x4656 0x21AF1
+0x4657 0x21AF0
+0x4658 0x21ADE
+0x4659 0x21B51
+0x465A 0x21F82
+0x465B 0x21FA9
+0x465C 0x21F98
+0x465D 0x21F9D
+0x465E 0x21F9A
+0x465F 0x21F9E
+0x4660 0x21F9F
+0x4661 0x21FA6
+0x4662 0x21FA7
+0x4663 0x22009
+0x4664 0x2202F
+0x4665 0x22171
+0x4666 0x2216D
+0x4667 0x22172
+0x4668 0x222EF
+0x4669 0x222F0
+0x466A 0x2243B
+0x466B 0x22439
+0x466C 0x2243C
+0x466D 0x22438
+0x466E 0x24BFD
+0x466F 0x2243A
+0x4670 0x22478
+0x4671 0x22479
+0x4672 0x22477
+0x4673 0x22598
+0x4674 0x2259C
+0x4675 0x22599
+0x4676 0x2259A
+0x4677 0x22911
+0x4678 0x2290A
+0x4679 0x228FD
+0x467A 0x2290F
+0x467B 0x22919
+0x467C 0x22903
+0x467D 0x22915
+0x467E 0x2290C
+0x4721 0x22909
+0x4722 0x22912
+0x4723 0x22934
+0x4724 0x2292A
+0x4725 0x22908
+0x4726 0x2292D
+0x4727 0x22928
+0x4728 0x2F8B1
+0x4729 0x2292C
+0x472A 0x22926
+0x472B 0x22933
+0x472D 0x22A1A
+0x472E 0x22A1E
+0x472F 0x22E07
+0x4730 0x22E2C
+0x4731 0x22E32
+0x4732 0x22E28
+0x4733 0x22E31
+0x4734 0x22E29
+0x4735 0x22E30
+0x4736 0x22E2A
+0x4737 0x22E44
+0x4738 0x22E2E
+0x4739 0x230D1
+0x473A 0x23124
+0x473B 0x232F7
+0x473C 0x232F4
+0x473D 0x232F3
+0x473E 0x232F8
+0x473F 0x237B5
+0x4740 0x23796
+0x4741 0x23798
+0x4742 0x23795
+0x4743 0x23791
+0x4744 0x237B2
+0x4745 0x2379E
+0x4746 0x23759
+0x4747 0x237A3
+0x4748 0x2379A
+0x4749 0x2379B
+0x474B 0x26183
+0x474C 0x23ADA
+0x474D 0x23ADF
+0x474E 0x23B16
+0x474F 0x23C1F
+0x4750 0x23C2D
+0x4751 0x23C2E
+0x4752 0x23C2B
+0x4753 0x240B8
+0x4754 0x240BB
+0x4755 0x240BF
+0x4756 0x240BA
+0x4757 0x240D5
+0x4758 0x240E3
+0x4759 0x240C1
+0x475A 0x240BE
+0x475B 0x240BD
+0x475C 0x240B4
+0x475D 0x240C2
+0x475E 0x240A1
+0x475F 0x24087
+0x4760 0x240D7
+0x4761 0x240CA
+0x4762 0x240B5
+0x4763 0x240DA
+0x4764 0x240D9
+0x4765 0x240B3
+0x4766 0x240D8
+0x4767 0x24467
+0x4768 0x24471
+0x4769 0x24462
+0x476A 0x2445C
+0x476B 0x24468
+0x476C 0x24452
+0x476D 0x24456
+0x476E 0x21109
+0x476F 0x20442
+0x4770 0x245A0
+0x4771 0x24700
+0x4772 0x246FE
+0x4773 0x246FF
+0x4774 0x248CB
+0x4775 0x2F928
+0x4776 0x248CA
+0x4777 0x248A9
+0x4778 0x248C8
+0x4779 0x24AB4
+0x477A 0x24AAC
+0x477B 0x24AAA
+0x477C 0x24AA9
+0x477D 0x24C0E
+0x477E 0x24CE9
+0x4821 0x24CED
+0x4822 0x24CF2
+0x4823 0x24CEB
+0x4824 0x24CEE
+0x4825 0x24EE8
+0x4826 0x24EDB
+0x4827 0x24ED7
+0x4828 0x24EE3
+0x4829 0x24EE5
+0x482A 0x24EEE
+0x482B 0x24ED5
+0x482C 0x24FB3
+0x482D 0x2502D
+0x482E 0x250C1
+0x482F 0x250C3
+0x4830 0x2530C
+0x4831 0x2530E
+0x4832 0x25307
+0x4833 0x25317
+0x4834 0x25309
+0x4835 0x25316
+0x4836 0x2539A
+0x4837 0x2539C
+0x4838 0x255B4
+0x4839 0x255B7
+0x483A 0x255B3
+0x483B 0x2154E
+0x483C 0x25713
+0x483D 0x25714
+0x483E 0x258E6
+0x483F 0x258DC
+0x4840 0x258E8
+0x4841 0x258E5
+0x4842 0x25A2E
+0x4843 0x25A2C
+0x4844 0x25A2B
+0x4845 0x25ACD
+0x4846 0x25D3D
+0x4847 0x25D32
+0x4848 0x25D2D
+0x4849 0x25D45
+0x484A 0x25D3E
+0x484B 0x25D50
+0x484C 0x25D25
+0x484D 0x25D53
+0x484E 0x25D23
+0x484F 0x25F37
+0x4850 0x25F38
+0x4851 0x25F47
+0x4852 0x25F3D
+0x4853 0x25F3E
+0x4854 0x25F49
+0x4855 0x25F4A
+0x4856 0x25F1D
+0x4858 0x261A5
+0x4859 0x2618C
+0x485A 0x2618D
+0x485B 0x26189
+0x485C 0x26196
+0x485D 0x26185
+0x485E 0x2618F
+0x485F 0x26177
+0x4860 0x2618E
+0x4861 0x26182
+0x4862 0x2618A
+0x4863 0x26188
+0x4864 0x2617B
+0x4865 0x26197
+0x4866 0x2617D
+0x4867 0x26179
+0x4868 0x26259
+0x4869 0x26324
+0x486A 0x2632D
+0x486B 0x2632E
+0x486C 0x2632B
+0x486D 0x2F976
+0x486E 0x263DA
+0x486F 0x263D8
+0x4870 0x263D6
+0x4871 0x26487
+0x4872 0x264A0
+0x4873 0x26528
+0x4874 0x26525
+0x4875 0x2651F
+0x4876 0x265F3
+0x4877 0x265F7
+0x4878 0x265F6
+0x4879 0x2682B
+0x487A 0x2685B
+0x487B 0x26848
+0x487D 0x2685C
+0x487E 0x2686D
+0x4921 0x2689D
+0x4922 0x26899
+0x4923 0x2688C
+0x4924 0x26891
+0x4925 0x2689B
+0x4926 0x2689A
+0x4927 0x2689C
+0x4928 0x26895
+0x4929 0x2688D
+0x492A 0x26896
+0x492B 0x268A5
+0x492C 0x2692A
+0x492D 0x269A1
+0x492E 0x269A4
+0x492F 0x269AD
+0x4930 0x26AA9
+0x4931 0x26AAE
+0x4932 0x26AB0
+0x4933 0x2700D
+0x4934 0x26F63
+0x4935 0x26F71
+0x4936 0x27051
+0x4937 0x27054
+0x4938 0x2702A
+0x4939 0x27044
+0x493A 0x27055
+0x493B 0x27099
+0x493C 0x27039
+0x493D 0x2703F
+0x493E 0x2703E
+0x493F 0x2704F
+0x4940 0x2704D
+0x4941 0x27035
+0x4942 0x27040
+0x4943 0x27031
+0x4944 0x26FD5
+0x4945 0x2702B
+0x4946 0x27033
+0x4947 0x27041
+0x4948 0x27056
+0x4949 0x2704C
+0x494A 0x27046
+0x494B 0x2703C
+0x494C 0x27045
+0x494D 0x27043
+0x494E 0x2703D
+0x494F 0x27070
+0x4950 0x27057
+0x4951 0x27038
+0x4952 0x27058
+0x4954 0x27037
+0x4955 0x27207
+0x4956 0x27206
+0x4957 0x27209
+0x4958 0x274AB
+0x4959 0x27490
+0x495A 0x27493
+0x495B 0x274BC
+0x495C 0x274A9
+0x495D 0x2749E
+0x495E 0x274BF
+0x495F 0x274AA
+0x4960 0x27491
+0x4961 0x274A4
+0x4962 0x2749A
+0x4963 0x274A7
+0x4964 0x274A1
+0x4965 0x2749C
+0x4966 0x274A2
+0x4967 0x2749B
+0x4968 0x2749F
+0x4969 0x27494
+0x496A 0x2748F
+0x496B 0x272F0
+0x496C 0x27492
+0x496D 0x27495
+0x496E 0x274A5
+0x496F 0x274A6
+0x4970 0x27604
+0x4971 0x2779C
+0x4972 0x27779
+0x4973 0x2777A
+0x4974 0x2777E
+0x4975 0x2777B
+0x4976 0x27771
+0x4977 0x27781
+0x4978 0x2777F
+0x4979 0x2777C
+0x497A 0x2777D
+0x497B 0x27775
+0x497C 0x27776
+0x497D 0x2788E
+0x497E 0x2788F
+0x4A21 0x2793E
+0x4A22 0x2793F
+0x4A23 0x27940
+0x4A24 0x27941
+0x4A26 0x27B0D
+0x4A27 0x27B17
+0x4A28 0x27B10
+0x4A29 0x27B0E
+0x4A2A 0x27AEA
+0x4A2B 0x27B1D
+0x4A2C 0x27B03
+0x4A2D 0x27B22
+0x4A2E 0x27B04
+0x4A2F 0x27B00
+0x4A30 0x27B20
+0x4A31 0x27B21
+0x4A32 0x27B23
+0x4A33 0x27B13
+0x4A34 0x27B09
+0x4A35 0x27B11
+0x4A36 0x27BCB
+0x4A37 0x27BCE
+0x4A38 0x27BD0
+0x4A39 0x27BCC
+0x4A3A 0x27BD4
+0x4A3B 0x214DB
+0x4A3C 0x27C09
+0x4A3D 0x27C0B
+0x4A3E 0x27C85
+0x4A3F 0x27D06
+0x4A40 0x27D0D
+0x4A42 0x27D14
+0x4A43 0x27D0F
+0x4A44 0x27E09
+0x4A45 0x27E14
+0x4A46 0x27E0B
+0x4A47 0x27DFC
+0x4A48 0x27E04
+0x4A49 0x27E0A
+0x4A4A 0x27E00
+0x4A4B 0x27DFD
+0x4A4C 0x27E07
+0x4A4D 0x27E06
+0x4A4E 0x27E11
+0x4A4F 0x27E79
+0x4A50 0x27E78
+0x4A51 0x27F88
+0x4A52 0x27F80
+0x4A53 0x27F8B
+0x4A54 0x28159
+0x4A55 0x28161
+0x4A56 0x28175
+0x4A58 0x28155
+0x4A59 0x2815B
+0x4A5A 0x2815F
+0x4A5B 0x28152
+0x4A5C 0x28162
+0x4A5D 0x28172
+0x4A5E 0x2815D
+0x4A5F 0x28168
+0x4A60 0x28171
+0x4A61 0x28165
+0x4A62 0x28166
+0x4A63 0x28167
+0x4A64 0x28176
+0x4A65 0x2814C
+0x4A66 0x28160
+0x4A67 0x28174
+0x4A68 0x28150
+0x4A69 0x2828A
+0x4A6A 0x28281
+0x4A6B 0x28286
+0x4A6C 0x2827F
+0x4A6D 0x28280
+0x4A6E 0x283A5
+0x4A6F 0x283A7
+0x4A70 0x283A8
+0x4A71 0x283A6
+0x4A72 0x283AF
+0x4A73 0x26195
+0x4A74 0x283B1
+0x4A75 0x28435
+0x4A76 0x28439
+0x4A77 0x285C3
+0x4A78 0x28630
+0x4A79 0x2862A
+0x4A7A 0x2862B
+0x4A7B 0x2862D
+0x4A7C 0x2862E
+0x4A7D 0x2862C
+0x4A7E 0x28623
+0x4B21 0x28621
+0x4B22 0x28622
+0x4B23 0x2876C
+0x4B24 0x28781
+0x4B25 0x2878F
+0x4B26 0x28780
+0x4B27 0x287D0
+0x4B28 0x287CD
+0x4B29 0x287D5
+0x4B2A 0x287D4
+0x4B2B 0x288D1
+0x4B2C 0x288BE
+0x4B2D 0x288CB
+0x4B2E 0x288CE
+0x4B2F 0x288BD
+0x4B30 0x288D0
+0x4B31 0x28B04
+0x4B32 0x28AD5
+0x4B33 0x28AD0
+0x4B34 0x28AD3
+0x4B35 0x28AFB
+0x4B36 0x28AD8
+0x4B37 0x28AD1
+0x4B38 0x28AFD
+0x4B39 0x28AD9
+0x4B3A 0x28AD6
+0x4B3B 0x28AE6
+0x4B3C 0x28AF9
+0x4B3D 0x28DA1
+0x4B3E 0x28D9D
+0x4B3F 0x28D9E
+0x4B41 0x28EFF
+0x4B42 0x28F5F
+0x4B43 0x28F57
+0x4B44 0x28F60
+0x4B45 0x28F59
+0x4B46 0x2902C
+0x4B47 0x29025
+0x4B48 0x29027
+0x4B49 0x29030
+0x4B4A 0x29024
+0x4B4B 0x29026
+0x4B4C 0x2902D
+0x4B4D 0x2902E
+0x4B4E 0x29029
+0x4B4F 0x29031
+0x4B50 0x29145
+0x4B51 0x29147
+0x4B52 0x29152
+0x4B53 0x2914A
+0x4B54 0x29150
+0x4B55 0x29146
+0x4B56 0x2914F
+0x4B57 0x2914E
+0x4B58 0x29153
+0x4B59 0x29321
+0x4B5A 0x29309
+0x4B5B 0x2931A
+0x4B5C 0x2931B
+0x4B5D 0x25315
+0x4B5E 0x29310
+0x4B5F 0x2F9F9
+0x4B60 0x29314
+0x4B61 0x2930E
+0x4B62 0x29312
+0x4B63 0x2930B
+0x4B64 0x293CF
+0x4B65 0x293D2
+0x4B66 0x293D0
+0x4B67 0x293D4
+0x4B68 0x293D3
+0x4B69 0x293D1
+0x4B6A 0x20B18
+0x4B6B 0x2F9FB
+0x4B6C 0x29409
+0x4B6D 0x2951C
+0x4B6E 0x29527
+0x4B6F 0x29525
+0x4B70 0x2951B
+0x4B71 0x29529
+0x4B72 0x2951F
+0x4B73 0x29530
+0x4B74 0x29524
+0x4B75 0x29528
+0x4B76 0x29519
+0x4B77 0x2952F
+0x4B78 0x29624
+0x4B79 0x29621
+0x4B7A 0x29625
+0x4B7B 0x29626
+0x4B7C 0x29627
+0x4B7D 0x29676
+0x4B7E 0x29766
+0x4C21 0x29775
+0x4C22 0x29769
+0x4C23 0x2977E
+0x4C24 0x2978F
+0x4C25 0x29774
+0x4C26 0x27210
+0x4C27 0x297AD
+0x4C28 0x2982B
+0x4C29 0x2982A
+0x4C2A 0x29858
+0x4C2B 0x29922
+0x4C2C 0x2991D
+0x4C2D 0x2992B
+0x4C2E 0x2992C
+0x4C2F 0x2992D
+0x4C30 0x29933
+0x4C31 0x2991B
+0x4C32 0x29927
+0x4C33 0x2992A
+0x4C34 0x29928
+0x4C35 0x2993B
+0x4C36 0x29A7E
+0x4C37 0x29A71
+0x4C38 0x29A79
+0x4C39 0x29A78
+0x4C3A 0x29A70
+0x4C3B 0x29A6D
+0x4C3C 0x29A7D
+0x4C3D 0x29A75
+0x4C3E 0x29A76
+0x4C3F 0x29ADE
+0x4C40 0x29B66
+0x4C41 0x29B83
+0x4C42 0x29B87
+0x4C43 0x29B7B
+0x4C44 0x29B89
+0x4C45 0x29B86
+0x4C46 0x29B82
+0x4C47 0x29B7C
+0x4C48 0x29B81
+0x4C49 0x29C43
+0x4C4A 0x29C45
+0x4C4B 0x29CF7
+0x4C4C 0x29CF9
+0x4C4D 0x29CFA
+0x4C4E 0x29E05
+0x4C4F 0x29DFE
+0x4C50 0x29E0F
+0x4C51 0x29DFF
+0x4C52 0x29DFA
+0x4C53 0x29E09
+0x4C54 0x29E20
+0x4C55 0x29E0C
+0x4C56 0x29E3C
+0x4C57 0x29E22
+0x4C58 0x29DF8
+0x4C59 0x29E0A
+0x4C5A 0x29E08
+0x4C5B 0x29DF7
+0x4C5C 0x2A08E
+0x4C5D 0x2A077
+0x4C5E 0x2A08B
+0x4C5F 0x2A0B4
+0x4C60 0x2A08A
+0x4C61 0x2A09A
+0x4C62 0x2A079
+0x4C63 0x2A083
+0x4C64 0x2A07F
+0x4C65 0x2A0A1
+0x4C66 0x2A08F
+0x4C67 0x2A0A3
+0x4C68 0x2A081
+0x4C69 0x2A094
+0x4C6A 0x2A07E
+0x4C6B 0x2A082
+0x4C6C 0x2A090
+0x4C6D 0x2A0A5
+0x4C6E 0x2A0AD
+0x4C6F 0x2A09D
+0x4C70 0x2A267
+0x4C71 0x2A269
+0x4C72 0x2A2CB
+0x4C73 0x2A2C8
+0x4C74 0x2A2D1
+0x4C75 0x2A340
+0x4C76 0x2A34B
+0x4C77 0x2A349
+0x4C78 0x2A346
+0x4C79 0x2A33E
+0x4C7A 0x2A343
+0x4C7B 0x2A33F
+0x4C7C 0x2A3A5
+0x4C7D 0x2A3A7
+0x4C7E 0x2A44E
+0x4D21 0x2A44D
+0x4D22 0x2259B
+0x4D23 0x2A4E5
+0x4D24 0x2A4E1
+0x4D25 0x2A4E2
+0x4D26 0x2A516
+0x4D27 0x2A514
+0x4D28 0x2FA1B
+0x4D29 0x2A559
+0x4D2A 0x2A551
+0x4D2B 0x2A55F
+0x4D2C 0x2A54A
+0x4D2D 0x2A557
+0x4D2E 0x2A558
+0x4D2F 0x2A5CA
+0x4D30 0x2A5DB
+0x4D31 0x2A5DE
+0x4D32 0x2A5E0
+0x4D33 0x2A5E1
+0x4D34 0x2A5DF
+0x4D35 0x2A5E2
+0x4D36 0x2A5E3
+0x4D37 0x2A692
+0x4D38 0x2A6BF
+0x4D39 0x2A6BE
+0x4D3A 0x2010B
+0x4D3B 0x20452
+0x4D3C 0x2044E
+0x4D3E 0x2F813
+0x4D3F 0x205A7
+0x4D40 0x20826
+0x4D41 0x20827
+0x4D42 0x208C6
+0x4D43 0x2090B
+0x4D44 0x2096A
+0x4D45 0x20978
+0x4D46 0x2111A
+0x4D47 0x21116
+0x4D48 0x21119
+0x4D49 0x21117
+0x4D4A 0x2111B
+0x4D4B 0x21118
+0x4D4C 0x21120
+0x4D4D 0x21237
+0x4D4E 0x214EC
+0x4D4F 0x21581
+0x4D50 0x2923D
+0x4D51 0x2190F
+0x4D52 0x219AD
+0x4D53 0x21AFB
+0x4D54 0x21B52
+0x4D55 0x21FAF
+0x4D56 0x21FB7
+0x4D57 0x21FB2
+0x4D58 0x22178
+0x4D59 0x221AC
+0x4D5A 0x22300
+0x4D5B 0x222FE
+0x4D5C 0x22302
+0x4D5D 0x222FD
+0x4D5E 0x22303
+0x4D5F 0x22440
+0x4D60 0x22443
+0x4D61 0x22442
+0x4D62 0x224B7
+0x4D63 0x225A2
+0x4D64 0x22900
+0x4D65 0x22935
+0x4D66 0x22941
+0x4D67 0x22905
+0x4D68 0x20453
+0x4D69 0x22950
+0x4D6A 0x2294E
+0x4D6B 0x22953
+0x4D6C 0x22E53
+0x4D6D 0x22E50
+0x4D6E 0x22E57
+0x4D6F 0x22E5F
+0x4D70 0x22E55
+0x4D71 0x22EEA
+0x4D72 0x23026
+0x4D73 0x29830
+0x4D74 0x2302A
+0x4D75 0x23028
+0x4D76 0x2302C
+0x4D77 0x2302D
+0x4D78 0x230D4
+0x4D79 0x23307
+0x4D7A 0x23358
+0x4D7B 0x23359
+0x4D7C 0x237C5
+0x4D7D 0x237CD
+0x4D7E 0x237C7
+0x4E21 0x237E8
+0x4E23 0x23932
+0x4E24 0x2A697
+0x4E25 0x23ADE
+0x4E26 0x23C32
+0x4E27 0x20AC8
+0x4E28 0x2F915
+0x4E29 0x240F1
+0x4E2A 0x240F0
+0x4E2B 0x240EC
+0x4E2C 0x24109
+0x4E2D 0x240F9
+0x4E2E 0x240F5
+0x4E2F 0x240FE
+0x4E30 0x24474
+0x4E31 0x24481
+0x4E32 0x2447C
+0x4E33 0x24475
+0x4E34 0x24489
+0x4E35 0x24482
+0x4E36 0x24497
+0x4E37 0x24486
+0x4E38 0x2447D
+0x4E39 0x24493
+0x4E3A 0x2449C
+0x4E3B 0x24476
+0x4E3C 0x24480
+0x4E3D 0x24545
+0x4E3E 0x206A1
+0x4E3F 0x24703
+0x4E40 0x248C9
+0x4E41 0x248CD
+0x4E42 0x248D0
+0x4E43 0x24AAD
+0x4E44 0x24AC5
+0x4E45 0x24BA2
+0x4E46 0x24CEC
+0x4E47 0x24CF6
+0x4E48 0x24CF3
+0x4E49 0x24EF3
+0x4E4A 0x24EFA
+0x4E4B 0x24EF9
+0x4E4C 0x24EF5
+0x4E4D 0x24EF4
+0x4E4E 0x24EF8
+0x4E4F 0x24FB6
+0x4E50 0x24FB4
+0x4E51 0x25032
+0x4E52 0x250CD
+0x4E53 0x250C8
+0x4E54 0x250CE
+0x4E55 0x250CA
+0x4E56 0x2532A
+0x4E57 0x25321
+0x4E58 0x2531D
+0x4E59 0x255BD
+0x4E5A 0x255BE
+0x4E5B 0x255C2
+0x4E5D 0x255C9
+0x4E5E 0x2571F
+0x4E5F 0x258F1
+0x4E60 0x258ED
+0x4E61 0x258F2
+0x4E62 0x258E0
+0x4E63 0x258F7
+0x4E64 0x25A30
+0x4E65 0x25A37
+0x4E66 0x25A31
+0x4E67 0x25A36
+0x4E68 0x25AC8
+0x4E69 0x25D6D
+0x4E6A 0x25D69
+0x4E6B 0x25D7D
+0x4E6C 0x25D61
+0x4E6D 0x25D70
+0x4E6E 0x25D71
+0x4E6F 0x25D73
+0x4E70 0x25D76
+0x4E71 0x25D75
+0x4E72 0x25D78
+0x4E73 0x25D79
+0x4E74 0x25D64
+0x4E75 0x25D6E
+0x4E76 0x25F51
+0x4E77 0x25F4F
+0x4E78 0x25F22
+0x4E79 0x261AF
+0x4E7A 0x261AA
+0x4E7B 0x261A3
+0x4E7C 0x2619D
+0x4E7D 0x2619C
+0x4E7E 0x261A1
+0x4F21 0x261B6
+0x4F22 0x261AC
+0x4F23 0x261A2
+0x4F24 0x261A7
+0x4F25 0x261B0
+0x4F26 0x261A9
+0x4F27 0x261C3
+0x4F28 0x26331
+0x4F29 0x26332
+0x4F2A 0x26333
+0x4F2B 0x26334
+0x4F2C 0x26337
+0x4F2D 0x2633C
+0x4F2E 0x263D9
+0x4F2F 0x263DD
+0x4F30 0x263DE
+0x4F31 0x263DF
+0x4F32 0x263E0
+0x4F33 0x264A5
+0x4F34 0x264AA
+0x4F35 0x264A2
+0x4F36 0x264A3
+0x4F37 0x26604
+0x4F38 0x26603
+0x4F39 0x265FE
+0x4F3A 0x26628
+0x4F3B 0x268AF
+0x4F3C 0x268AD
+0x4F3D 0x268A6
+0x4F3E 0x269AC
+0x4F3F 0x269A5
+0x4F40 0x269B0
+0x4F41 0x269B1
+0x4F42 0x26A01
+0x4F43 0x26AB2
+0x4F44 0x26AD2
+0x4F45 0x26AF1
+0x4F46 0x26FD1
+0x4F47 0x27047
+0x4F48 0x270C9
+0x4F49 0x270A7
+0x4F4A 0x270C8
+0x4F4B 0x27095
+0x4F4C 0x2708E
+0x4F4D 0x27091
+0x4F4E 0x2707D
+0x4F4F 0x270EE
+0x4F50 0x2708D
+0x4F51 0x2708C
+0x4F52 0x270B0
+0x4F53 0x27096
+0x4F54 0x27042
+0x4F55 0x2707C
+0x4F56 0x270B1
+0x4F57 0x270B2
+0x4F58 0x27084
+0x4F59 0x2709D
+0x4F5A 0x270A1
+0x4F5B 0x27098
+0x4F5C 0x270B3
+0x4F5D 0x27022
+0x4F5E 0x2707B
+0x4F5F 0x2708A
+0x4F60 0x270CE
+0x4F61 0x27080
+0x4F62 0x27097
+0x4F63 0x270B4
+0x4F64 0x270B5
+0x4F65 0x2709A
+0x4F66 0x2709F
+0x4F67 0x27093
+0x4F68 0x27212
+0x4F69 0x2720B
+0x4F6A 0x2720E
+0x4F6B 0x274A3
+0x4F6C 0x274CC
+0x4F6D 0x274DC
+0x4F6E 0x274E1
+0x4F6F 0x274DE
+0x4F70 0x274D2
+0x4F71 0x274DB
+0x4F72 0x274D9
+0x4F73 0x274D7
+0x4F74 0x274D4
+0x4F75 0x274C9
+0x4F76 0x274EB
+0x4F77 0x274DA
+0x4F78 0x274D1
+0x4F79 0x27504
+0x4F7A 0x274CA
+0x4F7B 0x274E2
+0x4F7C 0x275D7
+0x4F7D 0x2778C
+0x4F7E 0x27799
+0x5021 0x277A2
+0x5022 0x27796
+0x5023 0x27794
+0x5024 0x2779F
+0x5026 0x2778E
+0x5027 0x27803
+0x5028 0x27894
+0x5029 0x27893
+0x502A 0x27944
+0x502B 0x27B2F
+0x502C 0x27B35
+0x502D 0x27B2B
+0x502E 0x27B32
+0x502F 0x27B2D
+0x5030 0x27B36
+0x5032 0x27B31
+0x5033 0x27B12
+0x5034 0x27B33
+0x5035 0x27B1F
+0x5036 0x27B34
+0x5037 0x27B40
+0x5038 0x27B3F
+0x5039 0x27B41
+0x503A 0x27BD3
+0x503B 0x27C89
+0x503C 0x27D18
+0x503D 0x27D10
+0x503E 0x27E1A
+0x503F 0x27E25
+0x5040 0x27E1E
+0x5041 0x27F92
+0x5042 0x27F95
+0x5043 0x27F93
+0x5044 0x28184
+0x5045 0x2819A
+0x5046 0x28189
+0x5047 0x2818D
+0x5048 0x28188
+0x5049 0x28191
+0x504A 0x2819B
+0x504B 0x2819C
+0x504C 0x29548
+0x504D 0x2828E
+0x504E 0x28292
+0x504F 0x283C5
+0x5050 0x283C1
+0x5051 0x283B8
+0x5052 0x283BE
+0x5053 0x283B5
+0x5054 0x283C7
+0x5055 0x2843C
+0x5057 0x285EC
+0x5058 0x2863F
+0x5059 0x28639
+0x505A 0x28637
+0x505B 0x287A1
+0x505C 0x28794
+0x505D 0x287A0
+0x505E 0x287DE
+0x505F 0x287DB
+0x5060 0x287DF
+0x5061 0x287DC
+0x5062 0x288D6
+0x5063 0x288DC
+0x5064 0x288DD
+0x5065 0x288E0
+0x5066 0x288E3
+0x5067 0x288E1
+0x5068 0x28B18
+0x5069 0x28B19
+0x506A 0x28B53
+0x506B 0x2F9EC
+0x506C 0x28B44
+0x506D 0x28B0E
+0x506E 0x28B0F
+0x506F 0x28B47
+0x5070 0x28B17
+0x5071 0x28B1D
+0x5072 0x28B11
+0x5073 0x28CB4
+0x5074 0x28CB6
+0x5075 0x28DB7
+0x5076 0x28DBE
+0x5077 0x28DC2
+0x5078 0x28DB4
+0x5079 0x28F31
+0x507A 0x28F15
+0x507B 0x28F83
+0x507C 0x2903B
+0x507D 0x29036
+0x507E 0x29042
+0x5121 0x29050
+0x5122 0x29040
+0x5123 0x29034
+0x5124 0x29038
+0x5125 0x2903D
+0x5126 0x2903E
+0x5127 0x29035
+0x5128 0x2903A
+0x5129 0x29046
+0x512A 0x29037
+0x512B 0x29039
+0x512C 0x29045
+0x512D 0x29177
+0x512E 0x2915D
+0x512F 0x2916A
+0x5130 0x29176
+0x5131 0x2916B
+0x5132 0x2916C
+0x5133 0x29165
+0x5134 0x29164
+0x5135 0x29171
+0x5136 0x2915F
+0x5137 0x29172
+0x5138 0x291FE
+0x5139 0x291FF
+0x513A 0x2923E
+0x513B 0x2932B
+0x513C 0x29336
+0x513D 0x2932D
+0x513E 0x29339
+0x513F 0x2933F
+0x5140 0x2933B
+0x5141 0x29333
+0x5142 0x29342
+0x5143 0x2933A
+0x5144 0x293D5
+0x5145 0x293D8
+0x5146 0x293D9
+0x5147 0x2940D
+0x5148 0x2940A
+0x5149 0x29439
+0x514A 0x2943A
+0x514B 0x2953D
+0x514C 0x29545
+0x514D 0x2953A
+0x514E 0x29537
+0x514F 0x2953E
+0x5150 0x29542
+0x5151 0x29787
+0x5152 0x2978C
+0x5153 0x29782
+0x5154 0x2976B
+0x5155 0x297A0
+0x5156 0x2979A
+0x5157 0x29790
+0x5158 0x2978E
+0x5159 0x297A1
+0x515A 0x297BD
+0x515B 0x297B2
+0x515C 0x297B5
+0x515D 0x297B7
+0x515E 0x297AA
+0x515F 0x297A2
+0x5160 0x297A5
+0x5161 0x297AE
+0x5162 0x297AB
+0x5163 0x297BC
+0x5164 0x29832
+0x5165 0x2985A
+0x5166 0x29964
+0x5167 0x2995C
+0x5168 0x2994D
+0x5169 0x2993F
+0x516A 0x2993E
+0x516B 0x29952
+0x516C 0x29958
+0x516D 0x29957
+0x516E 0x2995E
+0x516F 0x29953
+0x5170 0x29954
+0x5171 0x29956
+0x5172 0x28F65
+0x5173 0x29A84
+0x5174 0x29A85
+0x5175 0x29A86
+0x5176 0x29B97
+0x5177 0x29BA1
+0x5178 0x29BA2
+0x517A 0x2FA0A
+0x517B 0x29BA3
+0x517C 0x29BA6
+0x517E 0x29C15
+0x5221 0x29C24
+0x5222 0x29C4A
+0x5223 0x29C49
+0x5224 0x29C48
+0x5225 0x29C4B
+0x5226 0x29D0E
+0x5227 0x29962
+0x5228 0x29D0B
+0x5229 0x29D0A
+0x522A 0x29D08
+0x522B 0x29D06
+0x522C 0x29E43
+0x522D 0x29E47
+0x522E 0x29E3F
+0x522F 0x29E46
+0x5230 0x29E50
+0x5232 0x29E4B
+0x5234 0x29E52
+0x5235 0x2A0D7
+0x5236 0x2A0BF
+0x5237 0x2A0D8
+0x5238 0x2A0E0
+0x5239 0x2A0E7
+0x523A 0x2A0B8
+0x523B 0x2A0D5
+0x523C 0x2A0EF
+0x523D 0x2A0E6
+0x523E 0x2A0E4
+0x523F 0x2A0D4
+0x5240 0x2A0D6
+0x5241 0x2A0EA
+0x5243 0x2A0BB
+0x5244 0x2A0E9
+0x5245 0x2FA10
+0x5246 0x2A26D
+0x5247 0x2A270
+0x5248 0x2A273
+0x5249 0x2A272
+0x524A 0x2A2D4
+0x524B 0x2A2CE
+0x524C 0x2A2D5
+0x524D 0x2A35A
+0x524E 0x2A358
+0x524F 0x2A352
+0x5250 0x2A350
+0x5251 0x2A355
+0x5252 0x2A34E
+0x5253 0x2A34D
+0x5254 0x2A3CB
+0x5255 0x2A3CC
+0x5256 0x2A3CD
+0x5257 0x2A3D1
+0x5258 0x2A458
+0x5259 0x2A463
+0x525A 0x2A45E
+0x525B 0x2A454
+0x525C 0x2A45B
+0x525D 0x2A4E9
+0x525E 0x2A4E7
+0x525F 0x2A4E8
+0x5260 0x2A51D
+0x5261 0x2A567
+0x5262 0x2A55A
+0x5263 0x2A55C
+0x5264 0x2A55B
+0x5265 0x2A561
+0x5266 0x2A5A1
+0x5268 0x2A5A4
+0x5269 0x2A5E9
+0x526A 0x2A5EF
+0x526B 0x2A5E5
+0x526C 0x2A5F5
+0x526D 0x2A5EB
+0x526E 0x2A5ED
+0x526F 0x2A696
+0x5270 0x2A695
+0x5271 0x2A6B3
+0x5272 0x2A6B5
+0x5273 0x2A6B1
+0x5275 0x2044D
+0x5276 0x20624
+0x5277 0x2082B
+0x5278 0x209CF
+0x5279 0x20AC9
+0x527A 0x21136
+0x527B 0x21131
+0x527C 0x21154
+0x527D 0x2113A
+0x527E 0x21138
+0x5321 0x21239
+0x5322 0x21238
+0x5323 0x214F4
+0x5324 0x214F3
+0x5325 0x214F6
+0x5326 0x214FC
+0x5327 0x214F5
+0x5328 0x214F1
+0x5329 0x2169C
+0x532A 0x21918
+0x532B 0x2191A
+0x532C 0x21AFC
+0x532D 0x21AFE
+0x532E 0x21B03
+0x532F 0x21B53
+0x5330 0x21D2B
+0x5331 0x21FC6
+0x5332 0x21FC1
+0x5333 0x2217B
+0x5334 0x22306
+0x5335 0x22449
+0x5336 0x224B8
+0x5337 0x225A3
+0x5338 0x22952
+0x5339 0x2294D
+0x533A 0x2295F
+0x533B 0x2295E
+0x533C 0x22961
+0x533D 0x22A23
+0x533E 0x22E8C
+0x533F 0x22E6F
+0x5340 0x22E75
+0x5341 0x22E74
+0x5342 0x22E71
+0x5343 0x22E70
+0x5344 0x22E6C
+0x5345 0x23126
+0x5346 0x23308
+0x5348 0x237F0
+0x5349 0x237EF
+0x534A 0x237FB
+0x534B 0x23810
+0x534C 0x2380C
+0x534D 0x237F6
+0x534E 0x237FE
+0x534F 0x23A7C
+0x5350 0x23AE1
+0x5351 0x23C38
+0x5352 0x23C6F
+0x5353 0x24118
+0x5354 0x24115
+0x5355 0x2411C
+0x5356 0x24110
+0x5357 0x24135
+0x5358 0x2F917
+0x5359 0x24117
+0x535A 0x2411D
+0x535B 0x24126
+0x535C 0x24128
+0x535D 0x24129
+0x535E 0x2412A
+0x535F 0x2411A
+0x5360 0x2F916
+0x5361 0x22307
+0x5362 0x244AB
+0x5363 0x244AC
+0x5364 0x244A1
+0x5365 0x244AE
+0x5366 0x244A3
+0x5367 0x244A7
+0x5368 0x24548
+0x5369 0x24604
+0x536A 0x246FD
+0x536C 0x24708
+0x536D 0x248D2
+0x536E 0x24AC6
+0x536F 0x24ABE
+0x5370 0x24B1C
+0x5371 0x24BA6
+0x5372 0x24BA7
+0x5373 0x24BAB
+0x5374 0x24C00
+0x5375 0x24CFB
+0x5376 0x24CFC
+0x5377 0x24CF9
+0x5378 0x24D01
+0x5379 0x24F06
+0x537A 0x24F04
+0x537B 0x2F93C
+0x537C 0x25034
+0x537D 0x25336
+0x537E 0x25332
+0x5421 0x25342
+0x5422 0x2532D
+0x5423 0x25335
+0x5424 0x255D8
+0x5425 0x25723
+0x5426 0x25720
+0x5427 0x25901
+0x5428 0x25900
+0x5429 0x25903
+0x542A 0x2A6BC
+0x542B 0x25A3C
+0x542C 0x25A41
+0x542D 0x25A35
+0x542E 0x25AC9
+0x542F 0x25D8E
+0x5430 0x25D9E
+0x5431 0x25D99
+0x5432 0x25DB4
+0x5433 0x25DAA
+0x5434 0x25D9F
+0x5435 0x25D96
+0x5436 0x25D9D
+0x5437 0x25DC3
+0x5438 0x25D74
+0x5439 0x25DAB
+0x543B 0x25F63
+0x543C 0x25F5B
+0x543D 0x25F5A
+0x543E 0x261C5
+0x543F 0x261C4
+0x5440 0x261CF
+0x5441 0x261C8
+0x5442 0x261A4
+0x5443 0x261BD
+0x5444 0x261D3
+0x5445 0x26260
+0x5446 0x2633B
+0x5447 0x263E3
+0x5448 0x263E7
+0x5449 0x264A8
+0x544A 0x264AC
+0x544B 0x264A9
+0x544C 0x2652A
+0x544D 0x26608
+0x544E 0x26609
+0x544F 0x268B9
+0x5450 0x26AC1
+0x5451 0x26AC2
+0x5452 0x26AB8
+0x5453 0x270E1
+0x5454 0x270EB
+0x5455 0x270E5
+0x5456 0x270FA
+0x5457 0x270E4
+0x5458 0x2710B
+0x5459 0x270D7
+0x545A 0x270EF
+0x545B 0x270E0
+0x545C 0x270EC
+0x545D 0x270FB
+0x545E 0x2F9B0
+0x545F 0x270D3
+0x5460 0x270E6
+0x5461 0x270FC
+0x5462 0x270E3
+0x5463 0x270CF
+0x5464 0x270DA
+0x5465 0x270DC
+0x5466 0x270D2
+0x5467 0x270A4
+0x5469 0x27217
+0x546A 0x27216
+0x546B 0x274F2
+0x546C 0x274FC
+0x546D 0x27518
+0x546E 0x274F6
+0x546F 0x274FE
+0x5470 0x274F3
+0x5471 0x274F7
+0x5472 0x27501
+0x5473 0x274F9
+0x5474 0x27506
+0x5475 0x274F5
+0x5476 0x27510
+0x5477 0x274DF
+0x5478 0x27503
+0x5479 0x27508
+0x547A 0x275D8
+0x547B 0x27605
+0x547C 0x27797
+0x547D 0x277B3
+0x547E 0x277AE
+0x5521 0x277AF
+0x5522 0x277A7
+0x5523 0x277B1
+0x5524 0x277A8
+0x5525 0x277AC
+0x5526 0x277AB
+0x5527 0x27804
+0x5528 0x2789A
+0x5529 0x2794A
+0x552A 0x27B42
+0x552B 0x27B58
+0x552C 0x27B4B
+0x552D 0x27B45
+0x552E 0x27B49
+0x552F 0x27B4C
+0x5530 0x27B59
+0x5531 0x27B56
+0x5533 0x27B46
+0x5534 0x27B44
+0x5535 0x27B5B
+0x5536 0x27B69
+0x5537 0x27C8E
+0x5538 0x27C8F
+0x5539 0x27D1E
+0x553A 0x268BC
+0x553B 0x27E2F
+0x553C 0x27F9E
+0x553D 0x27F9D
+0x553E 0x27F9F
+0x553F 0x27F9C
+0x5540 0x281B4
+0x5541 0x281AE
+0x5542 0x281AB
+0x5543 0x281B3
+0x5544 0x281AF
+0x5545 0x281C2
+0x5546 0x28293
+0x5547 0x28295
+0x5548 0x28296
+0x5549 0x28297
+0x554A 0x283CF
+0x554B 0x283CE
+0x554C 0x283CB
+0x554D 0x2844B
+0x554E 0x28646
+0x554F 0x28643
+0x5550 0x28645
+0x5551 0x28651
+0x5552 0x287AE
+0x5553 0x287AF
+0x5554 0x287B0
+0x5555 0x287B8
+0x5556 0x287E2
+0x5557 0x287E3
+0x5558 0x287E6
+0x5559 0x288ED
+0x555A 0x288EA
+0x555B 0x2893A
+0x555C 0x28B59
+0x555D 0x28B84
+0x555E 0x28B5F
+0x555F 0x28B7C
+0x5560 0x28B5C
+0x5561 0x28B58
+0x5562 0x28B55
+0x5563 0x28B5D
+0x5564 0x28B7E
+0x5565 0x28B80
+0x5566 0x28B83
+0x5567 0x28B57
+0x5569 0x28B5E
+0x556A 0x28CBA
+0x556B 0x28DD5
+0x556C 0x28F58
+0x556D 0x28F68
+0x556E 0x28F67
+0x556F 0x2904A
+0x5570 0x2904C
+0x5571 0x29052
+0x5572 0x29049
+0x5573 0x2904E
+0x5574 0x29047
+0x5575 0x2904D
+0x5576 0x2904B
+0x5577 0x2904F
+0x5578 0x2917E
+0x5579 0x29187
+0x557A 0x29183
+0x557B 0x29189
+0x557C 0x24ACA
+0x557D 0x29186
+0x557E 0x29188
+0x5621 0x29247
+0x5622 0x29242
+0x5623 0x29249
+0x5624 0x29248
+0x5628 0x29344
+0x5629 0x29351
+0x562A 0x29346
+0x562B 0x29347
+0x562C 0x293E4
+0x562D 0x2940F
+0x562E 0x2943F
+0x562F 0x2954B
+0x5630 0x29557
+0x5631 0x29552
+0x5633 0x29551
+0x5634 0x29558
+0x5635 0x2955E
+0x5636 0x29553
+0x5637 0x2955D
+0x5638 0x2954D
+0x5639 0x2963C
+0x563A 0x2963F
+0x563B 0x29646
+0x563C 0x2963E
+0x563D 0x29644
+0x563E 0x29645
+0x563F 0x29641
+0x5640 0x29638
+0x5641 0x29642
+0x5642 0x29643
+0x5643 0x2967A
+0x5644 0x297A3
+0x5645 0x297BA
+0x5646 0x297C0
+0x5647 0x297C4
+0x5648 0x297C6
+0x5649 0x297CB
+0x564A 0x29861
+0x564B 0x2997A
+0x564C 0x29973
+0x564D 0x29972
+0x564E 0x29974
+0x564F 0x29980
+0x5650 0x29981
+0x5652 0x29A95
+0x5653 0x29A8F
+0x5654 0x29A90
+0x5655 0x29A92
+0x5656 0x29A94
+0x5657 0x29A8B
+0x5658 0x29AE6
+0x5659 0x29BB2
+0x565A 0x29BB8
+0x565B 0x29BBD
+0x565C 0x29BBE
+0x565D 0x29BCE
+0x565E 0x29BBA
+0x565F 0x29C16
+0x5660 0x29C26
+0x5661 0x29C25
+0x5662 0x29C4C
+0x5663 0x29C50
+0x5664 0x29C4E
+0x5665 0x29C51
+0x5666 0x29C52
+0x5667 0x29D14
+0x5668 0x29D15
+0x5669 0x29D1B
+0x566A 0x29E82
+0x566B 0x29E99
+0x566C 0x29E9A
+0x566D 0x29E7D
+0x566E 0x29E85
+0x566F 0x29E86
+0x5670 0x29E9C
+0x5671 0x29E79
+0x5672 0x29E7B
+0x5673 0x29E80
+0x5674 0x29E83
+0x5675 0x29E81
+0x5676 0x2A11E
+0x5677 0x2A11B
+0x5678 0x2A12A
+0x5679 0x2A0FB
+0x567A 0x2A105
+0x567B 0x2A120
+0x567C 0x2A111
+0x567D 0x2A104
+0x567E 0x2A0FD
+0x5721 0x2A103
+0x5722 0x2A110
+0x5723 0x2A118
+0x5724 0x2A10A
+0x5725 0x2A14E
+0x5726 0x2A109
+0x5727 0x2A107
+0x5728 0x2A11C
+0x572A 0x2A277
+0x572B 0x2A276
+0x572C 0x2A2D8
+0x572D 0x2A2D9
+0x572E 0x2A361
+0x572F 0x2A35C
+0x5730 0x2A35E
+0x5731 0x2A360
+0x5732 0x2A3AA
+0x5733 0x2A3D6
+0x5734 0x2A3D8
+0x5735 0x2A409
+0x5736 0x2A408
+0x5737 0x2A46B
+0x5738 0x2A465
+0x5739 0x2A473
+0x573A 0x2A474
+0x573B 0x2A4ED
+0x573C 0x2A524
+0x573D 0x2A525
+0x573E 0x2A56A
+0x573F 0x2A5A7
+0x5740 0x2A5A8
+0x5741 0x2A60B
+0x5742 0x2A5FA
+0x5743 0x2A5F9
+0x5744 0x2A5FF
+0x5745 0x2A604
+0x5746 0x2A5F6
+0x5747 0x2A605
+0x5748 0x2A699
+0x5749 0x2A6AB
+0x574A 0x2A6BD
+0x574B 0x2A6B8
+0x574D 0x20464
+0x574E 0x2045A
+0x574F 0x20572
+0x5750 0x2097A
+0x5751 0x20B95
+0x5752 0x2115F
+0x5753 0x21161
+0x5754 0x2115E
+0x5755 0x2115A
+0x5756 0x2115C
+0x5757 0x2115D
+0x5758 0x2116E
+0x5759 0x21157
+0x575A 0x21158
+0x575B 0x21502
+0x575C 0x2150B
+0x575D 0x21508
+0x575E 0x21551
+0x575F 0x21925
+0x5760 0x21928
+0x5761 0x21923
+0x5762 0x21921
+0x5763 0x21924
+0x5764 0x21929
+0x5765 0x21B06
+0x5766 0x21B0A
+0x5767 0x21FCA
+0x5768 0x21FCC
+0x5769 0x21FCB
+0x576A 0x21FCF
+0x576B 0x2217F
+0x576C 0x2217C
+0x576D 0x221D6
+0x576E 0x22309
+0x576F 0x2230B
+0x5770 0x22376
+0x5771 0x2247D
+0x5772 0x225A5
+0x5773 0x2295B
+0x5774 0x2295C
+0x5775 0x2295D
+0x5776 0x22965
+0x5777 0x22E6D
+0x5778 0x22E82
+0x5779 0x22E83
+0x577A 0x22E87
+0x577B 0x22E95
+0x577C 0x22E8A
+0x577D 0x230D6
+0x577E 0x23128
+0x5821 0x2330D
+0x5822 0x2382E
+0x5823 0x2F8EE
+0x5824 0x2382D
+0x5825 0x23821
+0x5826 0x23819
+0x5827 0x2393B
+0x5828 0x2393C
+0x5829 0x2393A
+0x582A 0x23A7E
+0x582B 0x23C3B
+0x582C 0x24147
+0x582D 0x24139
+0x582E 0x24134
+0x582F 0x24136
+0x5830 0x24146
+0x5831 0x2413B
+0x5832 0x24141
+0x5833 0x24145
+0x5834 0x244C0
+0x5835 0x244C4
+0x5836 0x244BA
+0x5837 0x244BD
+0x5838 0x244BE
+0x5839 0x245A3
+0x583A 0x2470C
+0x583B 0x248D9
+0x583C 0x24ACD
+0x583D 0x24BAE
+0x583E 0x24CFF
+0x583F 0x24D24
+0x5840 0x24FBB
+0x5841 0x24FBC
+0x5842 0x25036
+0x5843 0x250D5
+0x5844 0x250D3
+0x5845 0x250D6
+0x5846 0x2533C
+0x5847 0x2533F
+0x5848 0x255DE
+0x5849 0x255E3
+0x584A 0x25727
+0x584B 0x25729
+0x584D 0x25905
+0x584E 0x25907
+0x584F 0x2590C
+0x5850 0x25AD0
+0x5851 0x25DBE
+0x5852 0x25DBC
+0x5853 0x25DD0
+0x5854 0x25DC2
+0x5855 0x25DB5
+0x5856 0x25DC9
+0x5857 0x25F66
+0x5859 0x261D5
+0x585A 0x261E2
+0x585B 0x261DC
+0x585C 0x261E3
+0x585D 0x261DA
+0x585E 0x261C2
+0x585F 0x261E8
+0x5860 0x263E9
+0x5861 0x264AF
+0x5862 0x264AD
+0x5863 0x264AE
+0x5864 0x2660B
+0x5865 0x268C1
+0x5866 0x269B6
+0x5867 0x269B9
+0x5868 0x26AC0
+0x5869 0x270A5
+0x586A 0x27128
+0x586B 0x27122
+0x586C 0x27129
+0x586D 0x27118
+0x586E 0x2711F
+0x586F 0x2711C
+0x5870 0x27112
+0x5871 0x2712A
+0x5873 0x27121
+0x5874 0x2712B
+0x5875 0x27117
+0x5876 0x270F0
+0x5877 0x27116
+0x5878 0x27123
+0x5879 0x2752B
+0x587A 0x27526
+0x587B 0x2753D
+0x587C 0x27522
+0x587D 0x2753A
+0x587E 0x27531
+0x5921 0x27532
+0x5922 0x27554
+0x5923 0x27521
+0x5924 0x27535
+0x5926 0x2752E
+0x5927 0x27530
+0x5928 0x2752F
+0x5929 0x27536
+0x592A 0x275DA
+0x592B 0x275D9
+0x592C 0x277BB
+0x592D 0x277BC
+0x592E 0x277B7
+0x592F 0x277C2
+0x5930 0x277BD
+0x5931 0x277B2
+0x5933 0x25344
+0x5934 0x25DD1
+0x5935 0x27B52
+0x5936 0x27B6B
+0x5937 0x27B67
+0x5939 0x27B61
+0x593A 0x27B6C
+0x593B 0x27B51
+0x593C 0x27B74
+0x593D 0x27B77
+0x593E 0x27B6F
+0x593F 0x27B6D
+0x5940 0x27B68
+0x5941 0x2F9D1
+0x5942 0x27B84
+0x5943 0x27C90
+0x5944 0x27C92
+0x5945 0x27C93
+0x5946 0x27D1F
+0x5947 0x27E31
+0x5948 0x27E38
+0x5949 0x27E39
+0x594A 0x27E37
+0x594B 0x27FAB
+0x594C 0x281C3
+0x594D 0x281C8
+0x594E 0x281CB
+0x594F 0x281CF
+0x5950 0x28298
+0x5951 0x283D4
+0x5952 0x283D3
+0x5953 0x283D8
+0x5954 0x283D9
+0x5955 0x283DD
+0x5956 0x283D1
+0x5957 0x283D6
+0x5958 0x2843E
+0x5959 0x28658
+0x595A 0x28657
+0x595B 0x28655
+0x595C 0x287C4
+0x595D 0x287E4
+0x595E 0x288EE
+0x595F 0x288EF
+0x5960 0x288F3
+0x5961 0x288F2
+0x5962 0x288F0
+0x5963 0x28BAB
+0x5964 0x28B9A
+0x5965 0x28BAF
+0x5966 0x28B97
+0x5969 0x28BBF
+0x596A 0x28B94
+0x596B 0x28B93
+0x596C 0x28CBE
+0x596D 0x28CBB
+0x596E 0x28CBC
+0x596F 0x28DD9
+0x5970 0x28F6C
+0x5971 0x29053
+0x5972 0x29054
+0x5973 0x2905B
+0x5974 0x29058
+0x5975 0x29056
+0x5976 0x29057
+0x5977 0x2919F
+0x5978 0x29194
+0x5979 0x29196
+0x597A 0x29197
+0x597B 0x2924A
+0x597C 0x2924B
+0x597D 0x29355
+0x597E 0x2935A
+0x5A21 0x2935E
+0x5A22 0x2935F
+0x5A23 0x29359
+0x5A24 0x2935B
+0x5A25 0x29358
+0x5A26 0x29354
+0x5A27 0x293E8
+0x5A28 0x293EB
+0x5A29 0x293EC
+0x5A2A 0x29413
+0x5A2B 0x29566
+0x5A2C 0x2956B
+0x5A2D 0x29562
+0x5A2E 0x29569
+0x5A2F 0x29563
+0x5A30 0x2955F
+0x5A31 0x2954E
+0x5A32 0x29648
+0x5A33 0x2964A
+0x5A34 0x297E3
+0x5A35 0x297DB
+0x5A36 0x297D8
+0x5A37 0x297D6
+0x5A38 0x29986
+0x5A39 0x29990
+0x5A3A 0x29991
+0x5A3B 0x29988
+0x5A3C 0x29994
+0x5A3D 0x29983
+0x5A3F 0x2999C
+0x5A40 0x2998D
+0x5A41 0x29985
+0x5A42 0x29A98
+0x5A43 0x29A9A
+0x5A44 0x29A9C
+0x5A45 0x29AE7
+0x5A46 0x29BC5
+0x5A47 0x29BD0
+0x5A48 0x29BD1
+0x5A49 0x29C19
+0x5A4A 0x29C27
+0x5A4C 0x29C54
+0x5A4D 0x29D2D
+0x5A4E 0x29D22
+0x5A50 0x29D1F
+0x5A51 0x29EBD
+0x5A52 0x29EAE
+0x5A53 0x29EBB
+0x5A54 0x29EAD
+0x5A55 0x29EBC
+0x5A56 0x29EB9
+0x5A57 0x29EB4
+0x5A58 0x29ECB
+0x5A59 0x29EB7
+0x5A5A 0x29EB3
+0x5A5B 0x29EBA
+0x5A5C 0x29EB6
+0x5A5D 0x29ECD
+0x5A5E 0x29EBE
+0x5A5F 0x29EC9
+0x5A60 0x2FA0B
+0x5A61 0x2A15F
+0x5A62 0x2A13B
+0x5A63 0x2A161
+0x5A64 0x2A15C
+0x5A65 0x2A18A
+0x5A66 0x2A15A
+0x5A67 0x2A14D
+0x5A68 0x2A146
+0x5A69 0x2A144
+0x5A6A 0x2A13D
+0x5A6B 0x2A140
+0x5A6C 0x2A13C
+0x5A6D 0x2A18C
+0x5A6E 0x2A141
+0x5A6F 0x2A14C
+0x5A70 0x2A13E
+0x5A71 0x2A14A
+0x5A72 0x2A27C
+0x5A73 0x2A27A
+0x5A74 0x2A365
+0x5A75 0x2A36E
+0x5A76 0x2A369
+0x5A77 0x2A36A
+0x5A78 0x2A36F
+0x5A79 0x2A36C
+0x5A7A 0x2A370
+0x5A7B 0x2A368
+0x5A7C 0x2A36B
+0x5A7E 0x2A3AC
+0x5B21 0x2A3DE
+0x5B22 0x2A3DD
+0x5B23 0x2A3DC
+0x5B24 0x244C5
+0x5B25 0x2A48C
+0x5B26 0x2A483
+0x5B27 0x2A482
+0x5B28 0x2A488
+0x5B29 0x2A485
+0x5B2A 0x2A481
+0x5B2B 0x2A4F5
+0x5B2C 0x2A4EF
+0x5B2D 0x2A4F4
+0x5B2E 0x2A4F2
+0x5B2F 0x2A4F6
+0x5B30 0x2A4F3
+0x5B31 0x2A4F0
+0x5B32 0x2A4F1
+0x5B33 0x2A52B
+0x5B34 0x2A527
+0x5B35 0x2A528
+0x5B36 0x2A56C
+0x5B37 0x2A5AE
+0x5B38 0x2A60E
+0x5B39 0x2A61B
+0x5B3A 0x2A616
+0x5B3B 0x2A61F
+0x5B3C 0x2A622
+0x5B3D 0x2A620
+0x5B3E 0x2A621
+0x5B3F 0x2A614
+0x5B40 0x2A613
+0x5B41 0x2A69D
+0x5B42 0x2A69C
+0x5B43 0x2A69E
+0x5B44 0x2A69F
+0x5B45 0x2046B
+0x5B46 0x208C8
+0x5B47 0x21178
+0x5B48 0x21176
+0x5B49 0x21170
+0x5B4A 0x21171
+0x5B4B 0x2150A
+0x5B4C 0x2192C
+0x5B4D 0x22311
+0x5B4E 0x2247E
+0x5B4F 0x22957
+0x5B50 0x22966
+0x5B51 0x22969
+0x5B52 0x22967
+0x5B53 0x22968
+0x5B54 0x22971
+0x5B55 0x2296F
+0x5B56 0x2A3AE
+0x5B57 0x22E8B
+0x5B58 0x22E96
+0x5B59 0x23035
+0x5B5A 0x2303A
+0x5B5B 0x2306B
+0x5B5C 0x23316
+0x5B5D 0x23843
+0x5B5E 0x23846
+0x5B5F 0x2383F
+0x5B60 0x2383B
+0x5B61 0x2383D
+0x5B62 0x239B1
+0x5B63 0x239B2
+0x5B64 0x23AE4
+0x5B65 0x23C40
+0x5B66 0x2415D
+0x5B67 0x24151
+0x5B68 0x2414D
+0x5B69 0x2414C
+0x5B6A 0x2415B
+0x5B6B 0x244D4
+0x5B6C 0x244D2
+0x5B6D 0x244CA
+0x5B6E 0x244C8
+0x5B6F 0x244D0
+0x5B70 0x244C9
+0x5B71 0x24549
+0x5B72 0x245A4
+0x5B73 0x24712
+0x5B74 0x2470F
+0x5B75 0x24711
+0x5B76 0x248DB
+0x5B77 0x248DD
+0x5B78 0x248DC
+0x5B79 0x24AD4
+0x5B7A 0x24B21
+0x5B7B 0x24BB2
+0x5B7C 0x24D04
+0x5B7D 0x24D02
+0x5B7E 0x24F11
+0x5C21 0x24F16
+0x5C22 0x24F10
+0x5C23 0x24FBE
+0x5C24 0x2721A
+0x5C25 0x2534C
+0x5C26 0x2534A
+0x5C27 0x255F2
+0x5C28 0x255F1
+0x5C29 0x2572A
+0x5C2A 0x2572C
+0x5C2B 0x2572F
+0x5C2C 0x25731
+0x5C2D 0x25911
+0x5C2E 0x25912
+0x5C2F 0x25A4B
+0x5C30 0x25DDB
+0x5C31 0x25DD6
+0x5C32 0x25DDD
+0x5C33 0x25DE2
+0x5C34 0x25DE4
+0x5C35 0x25DE0
+0x5C36 0x25DDF
+0x5C37 0x25DE3
+0x5C38 0x25F6E
+0x5C39 0x25F71
+0x5C3A 0x261E9
+0x5C3B 0x261EA
+0x5C3C 0x26263
+0x5C3D 0x263EB
+0x5C3E 0x263EA
+0x5C3F 0x268BD
+0x5C40 0x268BB
+0x5C41 0x268C6
+0x5C42 0x268CC
+0x5C43 0x268C8
+0x5C44 0x244CF
+0x5C45 0x268C9
+0x5C46 0x268CA
+0x5C47 0x268CF
+0x5C48 0x268D0
+0x5C49 0x269BA
+0x5C4A 0x269FB
+0x5C4B 0x26A03
+0x5C4C 0x26AC4
+0x5C4D 0x27149
+0x5C4E 0x27153
+0x5C4F 0x27136
+0x5C50 0x2714A
+0x5C51 0x27141
+0x5C52 0x2714E
+0x5C53 0x27119
+0x5C54 0x2714D
+0x5C55 0x27145
+0x5C56 0x2714C
+0x5C57 0x27147
+0x5C58 0x27148
+0x5C59 0x2714F
+0x5C5A 0x27137
+0x5C5B 0x27142
+0x5C5C 0x2754A
+0x5C5D 0x27546
+0x5C5F 0x27549
+0x5C60 0x2754F
+0x5C61 0x27551
+0x5C62 0x2754C
+0x5C64 0x27606
+0x5C65 0x27951
+0x5C66 0x27B7A
+0x5C67 0x27B83
+0x5C68 0x27B7E
+0x5C69 0x27B7F
+0x5C6A 0x27B80
+0x5C6B 0x24BB5
+0x5C6C 0x27C91
+0x5C6D 0x27C94
+0x5C6E 0x27C95
+0x5C6F 0x27D21
+0x5C70 0x27D20
+0x5C71 0x27E3D
+0x5C72 0x27E40
+0x5C73 0x27E46
+0x5C74 0x27E84
+0x5C75 0x27FAC
+0x5C76 0x27FAD
+0x5C78 0x281DA
+0x5C79 0x281D9
+0x5C7A 0x283E2
+0x5C7B 0x283E1
+0x5C7C 0x283E3
+0x5C7D 0x283E4
+0x5C7E 0x283DE
+0x5D21 0x283DF
+0x5D22 0x28641
+0x5D23 0x28659
+0x5D24 0x2865C
+0x5D25 0x2865A
+0x5D26 0x287E8
+0x5D27 0x288F6
+0x5D28 0x288FC
+0x5D29 0x288F7
+0x5D2A 0x288FA
+0x5D2B 0x288F9
+0x5D2C 0x28BC4
+0x5D2D 0x28BBE
+0x5D2E 0x28BD2
+0x5D2F 0x28BBD
+0x5D30 0x28B95
+0x5D31 0x28BD4
+0x5D32 0x28DE4
+0x5D33 0x29061
+0x5D34 0x29062
+0x5D35 0x29063
+0x5D36 0x29064
+0x5D37 0x29060
+0x5D38 0x2905C
+0x5D39 0x2905D
+0x5D3A 0x2905E
+0x5D3B 0x291A5
+0x5D3C 0x291A6
+0x5D3D 0x2924C
+0x5D3E 0x29368
+0x5D3F 0x2936E
+0x5D40 0x29371
+0x5D41 0x2936B
+0x5D42 0x2936F
+0x5D43 0x293EE
+0x5D44 0x293F1
+0x5D45 0x293F0
+0x5D46 0x293EF
+0x5D47 0x29415
+0x5D48 0x29414
+0x5D49 0x28F6E
+0x5D4A 0x29447
+0x5D4B 0x2957C
+0x5D4C 0x2957A
+0x5D4D 0x29574
+0x5D4E 0x29576
+0x5D4F 0x2956E
+0x5D50 0x29578
+0x5D51 0x2956D
+0x5D52 0x2956C
+0x5D53 0x2964E
+0x5D54 0x297D7
+0x5D55 0x297EA
+0x5D56 0x297E5
+0x5D57 0x29864
+0x5D58 0x299B3
+0x5D59 0x299A3
+0x5D5A 0x299A5
+0x5D5B 0x299A7
+0x5D5C 0x299A2
+0x5D5D 0x2999F
+0x5D5E 0x299A6
+0x5D5F 0x2999E
+0x5D60 0x299A8
+0x5D61 0x29AA9
+0x5D62 0x29AA6
+0x5D63 0x29AAA
+0x5D64 0x29AAB
+0x5D65 0x29AA0
+0x5D66 0x29AA1
+0x5D67 0x29AA8
+0x5D68 0x29AE8
+0x5D69 0x29AE9
+0x5D6A 0x29AEA
+0x5D6B 0x29BE4
+0x5D6C 0x29BDF
+0x5D6D 0x29BE0
+0x5D6E 0x29C28
+0x5D6F 0x29C5D
+0x5D70 0x29C5B
+0x5D71 0x29C56
+0x5D72 0x29C57
+0x5D73 0x29C5F
+0x5D74 0x29C62
+0x5D75 0x29EE1
+0x5D76 0x29EE3
+0x5D77 0x29EDE
+0x5D78 0x29ED9
+0x5D79 0x29EE8
+0x5D7A 0x29EF2
+0x5D7B 0x29EF6
+0x5D7C 0x29EE6
+0x5D7D 0x29EF4
+0x5D7E 0x29EF5
+0x5E21 0x29EE5
+0x5E22 0x29EE2
+0x5E24 0x2A196
+0x5E25 0x2A1AA
+0x5E26 0x2A197
+0x5E27 0x2A170
+0x5E28 0x2A1A1
+0x5E29 0x2A19D
+0x5E2A 0x2A1A9
+0x5E2B 0x2A16F
+0x5E2C 0x2A17E
+0x5E2D 0x2A194
+0x5E2E 0x2A19A
+0x5E2F 0x2A173
+0x5E30 0x2A187
+0x5E31 0x2A171
+0x5E32 0x2A177
+0x5E33 0x2A188
+0x5E34 0x2A18D
+0x5E35 0x2A185
+0x5E36 0x2A178
+0x5E37 0x2A1AD
+0x5E38 0x2A280
+0x5E39 0x2A281
+0x5E3A 0x2A2E5
+0x5E3B 0x2A2E7
+0x5E3C 0x2A37C
+0x5E3D 0x2A3AF
+0x5E3E 0x2A3E1
+0x5E3F 0x2A496
+0x5E40 0x2A4A3
+0x5E41 0x2A490
+0x5E42 0x2A4F8
+0x5E43 0x2A52E
+0x5E44 0x2A575
+0x5E45 0x2A57E
+0x5E46 0x2A57D
+0x5E47 0x2A57B
+0x5E48 0x2A578
+0x5E49 0x2A5B0
+0x5E4A 0x2A634
+0x5E4B 0x2A636
+0x5E4C 0x2A630
+0x5E4D 0x2FA1D
+0x5E4E 0x2A62E
+0x5E4F 0x2A637
+0x5E50 0x20ACE
+0x5E51 0x20B97
+0x5E52 0x20B98
+0x5E53 0x2117C
+0x5E54 0x2117E
+0x5E55 0x2117D
+0x5E56 0x2117F
+0x5E57 0x2150F
+0x5E58 0x216A4
+0x5E59 0x21931
+0x5E5A 0x2192E
+0x5E5B 0x2192F
+0x5E5C 0x21932
+0x5E5D 0x21D2C
+0x5E5E 0x21FD4
+0x5E5F 0x21FDC
+0x5E60 0x21FD8
+0x5E61 0x2200E
+0x5E62 0x22183
+0x5E63 0x22184
+0x5E64 0x22312
+0x5E65 0x22972
+0x5E66 0x2297C
+0x5E67 0x2297E
+0x5E68 0x22EA6
+0x5E69 0x22EA0
+0x5E6A 0x22E9E
+0x5E6B 0x22EA2
+0x5E6C 0x2312A
+0x5E6D 0x23318
+0x5E6E 0x2384D
+0x5E6F 0x23858
+0x5E70 0x2385B
+0x5E71 0x25914
+0x5E72 0x2F8F2
+0x5E73 0x23AE6
+0x5E74 0x24164
+0x5E75 0x24168
+0x5E76 0x24160
+0x5E77 0x24162
+0x5E78 0x244D7
+0x5E79 0x2454B
+0x5E7A 0x248E0
+0x5E7B 0x24B22
+0x5E7C 0x24D05
+0x5E7D 0x24F19
+0x5E7E 0x24F1A
+0x5F21 0x24FC3
+0x5F22 0x250D8
+0x5F23 0x250DC
+0x5F24 0x2534F
+0x5F25 0x255F7
+0x5F26 0x255F4
+0x5F27 0x255F8
+0x5F28 0x25913
+0x5F29 0x25A50
+0x5F2A 0x25DF0
+0x5F2B 0x25DE9
+0x5F2C 0x25DEF
+0x5F2D 0x25DED
+0x5F2E 0x25DEA
+0x5F2F 0x25DF8
+0x5F30 0x25E05
+0x5F31 0x25DF2
+0x5F32 0x25F72
+0x5F34 0x261F9
+0x5F35 0x261F3
+0x5F36 0x261F6
+0x5F37 0x261F2
+0x5F38 0x261F7
+0x5F39 0x26266
+0x5F3A 0x26265
+0x5F3B 0x26340
+0x5F3C 0x2F977
+0x5F3D 0x268D1
+0x5F3E 0x268D3
+0x5F3F 0x26A04
+0x5F40 0x27159
+0x5F41 0x27160
+0x5F42 0x2715B
+0x5F43 0x2715D
+0x5F44 0x2715E
+0x5F45 0x27169
+0x5F46 0x2715C
+0x5F47 0x27161
+0x5F48 0x2716A
+0x5F49 0x2715F
+0x5F4A 0x2754E
+0x5F4B 0x2755C
+0x5F4C 0x27560
+0x5F4D 0x27563
+0x5F4E 0x275DB
+0x5F4F 0x277CA
+0x5F50 0x277C9
+0x5F51 0x277C8
+0x5F52 0x278A5
+0x5F53 0x278A3
+0x5F54 0x27B8E
+0x5F55 0x27B87
+0x5F56 0x27B89
+0x5F57 0x27B85
+0x5F58 0x27B86
+0x5F59 0x27B8F
+0x5F5A 0x27B8A
+0x5F5B 0x27B90
+0x5F5C 0x27C98
+0x5F5D 0x27C9B
+0x5F5E 0x27E47
+0x5F5F 0x27E49
+0x5F60 0x27E48
+0x5F61 0x281E5
+0x5F62 0x281EA
+0x5F63 0x281ED
+0x5F64 0x283F0
+0x5F65 0x283EF
+0x5F66 0x283F2
+0x5F67 0x283EC
+0x5F68 0x28440
+0x5F69 0x28660
+0x5F6A 0x2865F
+0x5F6B 0x287EB
+0x5F6C 0x287EC
+0x5F6D 0x28900
+0x5F6E 0x28901
+0x5F6F 0x28BE2
+0x5F70 0x28BDF
+0x5F71 0x28BE0
+0x5F72 0x28BE1
+0x5F73 0x28BE3
+0x5F74 0x28CC3
+0x5F75 0x28DEB
+0x5F76 0x28DEA
+0x5F77 0x28F61
+0x5F78 0x28F71
+0x5F79 0x2906B
+0x5F7A 0x29068
+0x5F7B 0x29069
+0x5F7C 0x29067
+0x5F7D 0x291B0
+0x5F7E 0x291B1
+0x6021 0x291B2
+0x6022 0x29251
+0x6023 0x29374
+0x6024 0x2957F
+0x6025 0x29584
+0x6026 0x29653
+0x6027 0x29654
+0x6028 0x297F0
+0x6029 0x297F4
+0x602A 0x297F1
+0x602B 0x29837
+0x602C 0x299BF
+0x602F 0x299BD
+0x6030 0x299BE
+0x6031 0x299B7
+0x6032 0x299C0
+0x6033 0x299BA
+0x6034 0x299B8
+0x6035 0x299BC
+0x6036 0x299BB
+0x6037 0x29AEB
+0x6038 0x29BE7
+0x6039 0x29C1D
+0x603A 0x29C1C
+0x603B 0x29C63
+0x603C 0x2244B
+0x603D 0x29D38
+0x603E 0x29D36
+0x603F 0x29D34
+0x6040 0x29D37
+0x6041 0x29F06
+0x6042 0x29F1C
+0x6043 0x29F02
+0x6044 0x29F1D
+0x6045 0x29F1E
+0x6046 0x29EE0
+0x6047 0x29F11
+0x6048 0x29F18
+0x6049 0x29F21
+0x604A 0x29F20
+0x604B 0x29F10
+0x604C 0x2A1BD
+0x604D 0x2A1AE
+0x604E 0x2A1B5
+0x604F 0x2A1B8
+0x6050 0x2A1B9
+0x6051 0x2A1BE
+0x6052 0x2A1C4
+0x6053 0x2A1BC
+0x6054 0x2A1BA
+0x6055 0x2A283
+0x6056 0x2A2EA
+0x6057 0x2A2EC
+0x6058 0x2A37E
+0x6059 0x2A37B
+0x605A 0x2A3E5
+0x605B 0x2A4A7
+0x605C 0x2A49E
+0x605D 0x2A49A
+0x605E 0x2A52F
+0x605F 0x2A531
+0x6060 0x2A583
+0x6061 0x2A5B5
+0x6062 0x2A646
+0x6063 0x2A641
+0x6064 0x2A643
+0x6065 0x2A63D
+0x6066 0x2A642
+0x6067 0x2A63B
+0x6068 0x2A647
+0x6069 0x2096B
+0x606A 0x209D0
+0x606B 0x2118E
+0x606C 0x21B11
+0x606D 0x2F871
+0x606E 0x2F889
+0x606F 0x2244C
+0x6070 0x2312B
+0x6071 0x2384F
+0x6072 0x2385E
+0x6073 0x23863
+0x6074 0x2386B
+0x6075 0x2393F
+0x6076 0x23AE9
+0x6077 0x2416D
+0x6078 0x2416B
+0x6079 0x2416A
+0x607A 0x29F2A
+0x607B 0x244E0
+0x607C 0x244DD
+0x607D 0x244E1
+0x607E 0x244DE
+0x6121 0x244DC
+0x6122 0x2454D
+0x6123 0x24716
+0x6124 0x248E3
+0x6125 0x24AE5
+0x6126 0x24AE4
+0x6127 0x24F1D
+0x6128 0x2574B
+0x6129 0x2A6C1
+0x612A 0x25A4E
+0x612B 0x25AD6
+0x612C 0x25DFD
+0x612D 0x25E07
+0x612E 0x25DFE
+0x612F 0x25E03
+0x6130 0x25E0B
+0x6131 0x25DFF
+0x6132 0x25F7A
+0x6133 0x25F77
+0x6134 0x261FB
+0x6135 0x26343
+0x6136 0x263ED
+0x6137 0x269BC
+0x6138 0x244DF
+0x6139 0x26A05
+0x613A 0x26AC6
+0x613B 0x26AC5
+0x613C 0x27174
+0x613D 0x27173
+0x613E 0x27172
+0x613F 0x27178
+0x6140 0x27573
+0x6141 0x2757A
+0x6142 0x24F1C
+0x6143 0x27576
+0x6144 0x27575
+0x6145 0x27577
+0x6146 0x277CF
+0x6147 0x277CE
+0x6148 0x277CD
+0x6149 0x278A8
+0x614A 0x27B98
+0x614B 0x27B92
+0x614C 0x27B94
+0x614D 0x27C9A
+0x614E 0x27FB4
+0x614F 0x281EB
+0x6150 0x281F4
+0x6151 0x281F3
+0x6152 0x281EE
+0x6153 0x281F2
+0x6154 0x281F0
+0x6155 0x28664
+0x6156 0x28C05
+0x6157 0x28BFB
+0x6158 0x28BFC
+0x6159 0x28DF3
+0x615A 0x2906C
+0x615B 0x291BA
+0x615C 0x29379
+0x615D 0x2937E
+0x615E 0x29378
+0x615F 0x293F4
+0x6160 0x29416
+0x6161 0x29657
+0x6162 0x299C8
+0x6163 0x299C3
+0x6164 0x299CE
+0x6165 0x29AB3
+0x6166 0x29AED
+0x6167 0x29AEE
+0x6168 0x29BF1
+0x6169 0x29BF8
+0x616B 0x29C64
+0x616C 0x29C65
+0x616D 0x29F35
+0x616E 0x29F29
+0x616F 0x29F2C
+0x6170 0x29F31
+0x6171 0x29F2B
+0x6172 0x29F2E
+0x6173 0x29F25
+0x6174 0x2A1DA
+0x6175 0x2A1E0
+0x6176 0x2A1D4
+0x6177 0x2A1E1
+0x6178 0x2A1DD
+0x6179 0x2A3E7
+0x617A 0x2A412
+0x617B 0x2A4AE
+0x617C 0x2A4AF
+0x617D 0x2A586
+0x617E 0x2A585
+0x6221 0x2A5D1
+0x6222 0x2A658
+0x6223 0x2A63F
+0x6224 0x2A652
+0x6225 0x2A64B
+0x6226 0x2A653
+0x6227 0x2A650
+0x6228 0x2A656
+0x6229 0x2A657
+0x622A 0x2A6CD
+0x622B 0x2A6CB
+0x622C 0x20831
+0x622D 0x20830
+0x622E 0x209D1
+0x6230 0x21192
+0x6231 0x21190
+0x6232 0x2118F
+0x6233 0x21193
+0x6234 0x21191
+0x6236 0x22313
+0x6237 0x2247F
+0x6238 0x22EAC
+0x6239 0x24170
+0x623A 0x244E5
+0x623B 0x24B23
+0x623C 0x24B24
+0x623D 0x24D08
+0x623E 0x24D07
+0x623F 0x24F1F
+0x6240 0x24F20
+0x6241 0x24F21
+0x6242 0x250E1
+0x6243 0x25354
+0x6244 0x25357
+0x6245 0x25355
+0x6246 0x255FA
+0x6247 0x25738
+0x6248 0x27186
+0x6249 0x25737
+0x624A 0x25A53
+0x624B 0x25F7E
+0x624C 0x25F7B
+0x624D 0x2F971
+0x624E 0x261FD
+0x624F 0x261FC
+0x6250 0x26346
+0x6251 0x26932
+0x6252 0x26AC7
+0x6253 0x27171
+0x6254 0x27183
+0x6255 0x2716F
+0x6256 0x2717E
+0x6257 0x2717D
+0x6258 0x27181
+0x6259 0x2717C
+0x625A 0x2758A
+0x625B 0x2757E
+0x625C 0x27580
+0x625D 0x2757D
+0x625E 0x2757F
+0x625F 0x27582
+0x6260 0x277D4
+0x6261 0x277D0
+0x6262 0x277D2
+0x6263 0x27955
+0x6264 0x27B9B
+0x6265 0x27B9A
+0x6266 0x27E4E
+0x6267 0x281F1
+0x6268 0x283F8
+0x6269 0x283FD
+0x626A 0x2865E
+0x626B 0x28666
+0x626C 0x28905
+0x626D 0x28C0A
+0x626E 0x28C0B
+0x626F 0x28C0E
+0x6270 0x28C0D
+0x6271 0x28C11
+0x6272 0x28C09
+0x6273 0x28C10
+0x6274 0x28C0C
+0x6275 0x28C12
+0x6276 0x28CC4
+0x6277 0x28DF7
+0x6278 0x28DF8
+0x6279 0x28F6A
+0x627A 0x28F6B
+0x627B 0x291C0
+0x627C 0x291C2
+0x627D 0x29385
+0x627E 0x29380
+0x6321 0x29384
+0x6322 0x29381
+0x6323 0x291C4
+0x6324 0x2958B
+0x6325 0x2958D
+0x6326 0x2958E
+0x6327 0x29AB7
+0x6328 0x29AB9
+0x6329 0x29AEF
+0x632A 0x29BFB
+0x632B 0x29BFF
+0x632C 0x29C67
+0x632D 0x29C68
+0x632E 0x29C69
+0x632F 0x29D3F
+0x6330 0x29F3C
+0x6331 0x29F4C
+0x6332 0x29F3D
+0x6333 0x29F3E
+0x6334 0x29F3F
+0x6335 0x29F3B
+0x6336 0x2A1FF
+0x6338 0x2A1F6
+0x6339 0x2A1EE
+0x633A 0x2A1FC
+0x633B 0x2A1F8
+0x633C 0x2A201
+0x633D 0x2A1FA
+0x633E 0x2A288
+0x633F 0x2A380
+0x6340 0x2A411
+0x6341 0x2A4FE
+0x6342 0x2A500
+0x6343 0x2A535
+0x6344 0x2503C
+0x6345 0x2A5BD
+0x6346 0x2A5BB
+0x6347 0x2A65C
+0x6348 0x2A65A
+0x6349 0x2A6D1
+0x634A 0x2A6D0
+0x634B 0x20A0B
+0x634C 0x23873
+0x634D 0x21939
+0x634E 0x21B1A
+0x634F 0x21FE3
+0x6350 0x22187
+0x6351 0x22377
+0x6352 0x22378
+0x6353 0x22EB1
+0x6354 0x2386A
+0x6355 0x23874
+0x6356 0x23AEB
+0x6357 0x2417B
+0x6358 0x245A5
+0x6359 0x248E4
+0x635A 0x24D0B
+0x635B 0x24D0E
+0x635C 0x24D0C
+0x635D 0x25739
+0x635E 0x25E10
+0x635F 0x25E11
+0x6360 0x25E16
+0x6361 0x25F81
+0x6362 0x25F80
+0x6363 0x261FE
+0x6364 0x26201
+0x6365 0x26200
+0x6366 0x26347
+0x6367 0x263EF
+0x6368 0x27188
+0x6369 0x2758B
+0x636A 0x2758D
+0x636B 0x27587
+0x636C 0x27585
+0x636D 0x2758F
+0x636E 0x27584
+0x636F 0x27588
+0x6370 0x2758E
+0x6371 0x2758C
+0x6372 0x277D7
+0x6373 0x277D6
+0x6374 0x27B9F
+0x6375 0x22188
+0x6376 0x28203
+0x6377 0x283FE
+0x6378 0x287EF
+0x6379 0x28909
+0x637A 0x28908
+0x637B 0x28C20
+0x637C 0x28C24
+0x637D 0x28C1F
+0x637E 0x29070
+0x6421 0x29256
+0x6422 0x293F7
+0x6423 0x293F8
+0x6424 0x293F6
+0x6425 0x29590
+0x6426 0x2965E
+0x6427 0x297F7
+0x6428 0x299D6
+0x6429 0x299D5
+0x642A 0x29ABB
+0x642B 0x29AF0
+0x642C 0x29C01
+0x642D 0x29C6C
+0x642E 0x29D41
+0x642F 0x29D42
+0x6430 0x29F4F
+0x6431 0x29F53
+0x6432 0x29F58
+0x6433 0x2A212
+0x6434 0x2A204
+0x6435 0x2A213
+0x6436 0x2A205
+0x6437 0x2A20D
+0x6438 0x2A382
+0x6439 0x2A381
+0x643A 0x2A4B5
+0x643B 0x2A4BA
+0x643C 0x2A5BE
+0x643D 0x2A665
+0x643E 0x2A663
+0x643F 0x2A66E
+0x6440 0x2A66A
+0x6441 0x2A66C
+0x6442 0x2A6C4
+0x6443 0x2096C
+0x6444 0x27BA5
+0x6445 0x21B12
+0x6446 0x2244D
+0x6447 0x2331F
+0x6448 0x23877
+0x6449 0x23878
+0x644A 0x23C44
+0x644B 0x2417C
+0x644C 0x244EB
+0x644D 0x244EA
+0x644E 0x244EC
+0x644F 0x245A7
+0x6450 0x24719
+0x6451 0x24F23
+0x6453 0x25601
+0x6454 0x25E1C
+0x6455 0x26203
+0x6456 0x26348
+0x6457 0x268DA
+0x6458 0x27191
+0x6459 0x27192
+0x645A 0x27596
+0x645B 0x27597
+0x645C 0x27591
+0x645D 0x27593
+0x645E 0x277D8
+0x645F 0x277D5
+0x6460 0x27957
+0x6461 0x27958
+0x6462 0x27BA2
+0x6463 0x28205
+0x6464 0x283FA
+0x6465 0x2890C
+0x6466 0x2890A
+0x6467 0x28C2E
+0x6468 0x28C29
+0x6469 0x28C2F
+0x646A 0x28CC5
+0x646B 0x29072
+0x646C 0x291C8
+0x646D 0x2925A
+0x646E 0x29259
+0x646F 0x29389
+0x6470 0x29388
+0x6471 0x299DB
+0x6472 0x299D9
+0x6473 0x299DA
+0x6474 0x29ABC
+0x6476 0x29C06
+0x6477 0x29C05
+0x6478 0x29C6F
+0x6479 0x29C6D
+0x647A 0x29C70
+0x647B 0x29F60
+0x647C 0x29F5E
+0x647D 0x29F63
+0x647E 0x29F5A
+0x6521 0x29F5F
+0x6522 0x2A219
+0x6523 0x2A21D
+0x6524 0x2A21B
+0x6525 0x2A222
+0x6526 0x2A21C
+0x6527 0x2A21E
+0x6528 0x2A2F7
+0x6529 0x2A384
+0x652A 0x2A415
+0x652B 0x2A4B8
+0x652C 0x2A4C1
+0x652D 0x2A501
+0x652E 0x2A50A
+0x652F 0x2A5D2
+0x6530 0x2A675
+0x6531 0x2A674
+0x6532 0x2A672
+0x6533 0x20AD0
+0x6534 0x21B1B
+0x6535 0x22010
+0x6536 0x22379
+0x6537 0x244ED
+0x6538 0x24BB9
+0x6539 0x24F24
+0x653A 0x24FC5
+0x653B 0x25603
+0x653C 0x2634A
+0x653D 0x268F7
+0x653E 0x269C1
+0x653F 0x269C2
+0x6540 0x27194
+0x6541 0x27599
+0x6542 0x2759A
+0x6543 0x2795A
+0x6544 0x27BA8
+0x6545 0x27C25
+0x6546 0x27C9E
+0x6547 0x28441
+0x6548 0x28C32
+0x6549 0x28C33
+0x654A 0x291CB
+0x654B 0x291CA
+0x654C 0x291CC
+0x654D 0x29593
+0x654E 0x299E0
+0x654F 0x29C71
+0x6550 0x29F6B
+0x6551 0x2A22B
+0x6552 0x2A229
+0x6553 0x2A21A
+0x6554 0x2A226
+0x6555 0x2A227
+0x6556 0x2A22A
+0x6557 0x2A2F8
+0x6558 0x2503D
+0x6559 0x2A676
+0x655A 0x21518
+0x655B 0x2387A
+0x655C 0x2417F
+0x655E 0x263F0
+0x655F 0x2719A
+0x6560 0x27196
+0x6561 0x2759E
+0x6562 0x2759D
+0x6563 0x275DC
+0x6564 0x277DA
+0x6565 0x2820B
+0x6566 0x28402
+0x6567 0x28442
+0x6568 0x28667
+0x6569 0x2938B
+0x656A 0x299E2
+0x656B 0x29F71
+0x656C 0x2A22F
+0x656D 0x2A22E
+0x656E 0x2A4C6
+0x656F 0x2A58E
+0x6570 0x2A67B
+0x6571 0x2A677
+0x6572 0x2A678
+0x6573 0x2A67C
+0x6574 0x2387C
+0x6575 0x26207
+0x6576 0x27197
+0x6577 0x27BD9
+0x6578 0x2890D
+0x6579 0x2890E
+0x657A 0x299E3
+0x657B 0x299E4
+0x657C 0x29AF3
+0x657D 0x29C75
+0x657E 0x2A237
+0x6621 0x2A235
+0x6622 0x2A58F
+0x6623 0x2A680
+0x6624 0x2A67F
+0x6625 0x2A6D4
+0x6626 0x22EB4
+0x6627 0x2A3EC
+0x6628 0x28F75
+0x6629 0x24D10
+0x662A 0x26269
+0x662B 0x275A4
+0x662C 0x277DB
+0x662D 0x291D1
+0x662E 0x2938D
+0x662F 0x29F76
+0x6630 0x2A239
+0x6631 0x2A684
+0x6632 0x2A682
+0x6633 0x20AD2
+0x6634 0x244EE
+0x6635 0x24D11
+0x6636 0x25F84
+0x6637 0x28F74
+0x6638 0x2938F
+0x6639 0x2938E
+0x663A 0x2A23B
+0x663B 0x208CB
+0x663C 0x2A688
+0x663D 0x2A686
+0x663E 0x2335C
+0x663F 0x253A4
+0x6640 0x29075
+0x6641 0x2A68B
+0x6642 0x21519
+0x6643 0x27C9F
+0x6644 0x299E5
+0x6645 0x2A240
+0x6646 0x24D12
+0x6647 0x2A2FB
+0x6648 0x2A68C
+0x6649 0x253A5
+0x664A 0x29C77
+0x664B 0x29C78
+0x664C 0x2A6D6
+0x664D 0x277DF
+0x664E 0x291D2
+0x664F 0x2151A
+0x6650 0x27BA9
+0x6651 0x291D3
+0x6652 0x2A4CA
+0x6653 0x269C4
+0x6654 0x278B1
+0x6655 0x29664
diff --git a/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java
new file mode 100644
index 0000000..2f15355
--- /dev/null
+++ b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java
@@ -0,0 +1,1191 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4750497
+   @summary Check surrogate coverage of Big5-HKSCS (2001)
+ */
+
+/*
+ * Tests the HKSCS converter. Supplements the test for BMP
+ * mappings (and compatibility char->byte mappings) provided
+ * via ./test/sun/io/Converter/Big5-HKSCS.b2c and
+ * ./test/sun/io/Converter/Big5-HKSCS.c2b-irreversible
+ *
+ * Mappings available at :
+ * http://www.info.gov.hk/digital21/eng/hkscs/download.html
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestHKSCS {
+
+    /**
+     * int array holding the supplementary character
+     * values (encoded as ints below) for full set of 1651
+     * supplementary chars / surrogate pairs which should
+     * be round-trip mappable within Big5-HKSCS 2001
+     *
+     */
+
+    static int[] suppValues = {
+        0x20021, 0x2003E, 0x20046, 0x2004E, 0x20068, 0x20086,
+        0x20087, 0x2008A, 0x20094, 0x200CA, 0x200CB, 0x200CC,
+        0x200CD, 0x200D1, 0x200EE, 0x2010C, 0x2010E, 0x20118,
+        0x201A9, 0x201AB, 0x201C1, 0x201D4, 0x201F2, 0x20204,
+        0x2020C, 0x20214, 0x2025B, 0x20274, 0x20275, 0x20299,
+        0x2029E, 0x202A0, 0x202B7, 0x202BF, 0x202C0, 0x202E5,
+        0x2030A, 0x20325, 0x20341, 0x20345, 0x20346, 0x20347,
+        0x2037E, 0x2037F, 0x20380, 0x203A0, 0x203A7, 0x203B5,
+        0x203C9, 0x203CB, 0x203F5, 0x203FC, 0x20413, 0x20414,
+        0x2041F, 0x20465, 0x20487, 0x2048E, 0x20491, 0x20492,
+        0x204A3, 0x204D7, 0x204FC, 0x204FE, 0x20547, 0x2058E,
+        0x205A5, 0x205B3, 0x205C3, 0x205CA, 0x205D0, 0x205D5,
+        0x205DF, 0x205E0, 0x205EB, 0x20611, 0x20615, 0x20619,
+        0x2061A, 0x20630, 0x20656, 0x20676, 0x2070E, 0x20731,
+        0x20779, 0x2082C, 0x20873, 0x208D5, 0x20916, 0x20923,
+        0x20954, 0x20979, 0x209E7, 0x20A11, 0x20A50, 0x20AB4,
+        0x20AC2, 0x20ACD, 0x20B0D, 0x20B8F, 0x20BA8, 0x20BA9,
+        0x20BBF, 0x20BC6, 0x20BCB, 0x20BE2, 0x20BEB, 0x20BFB,
+        0x20BFF, 0x20C0B, 0x20C0D, 0x20C20, 0x20C34, 0x20C3A,
+        0x20C3B, 0x20C41, 0x20C42, 0x20C43, 0x20C53, 0x20C65,
+        0x20C77, 0x20C78, 0x20C7C, 0x20C8D, 0x20C96, 0x20C9C,
+        0x20CB5, 0x20CB8, 0x20CCF, 0x20CD3, 0x20CD4, 0x20CD5,
+        0x20CD6, 0x20CDD, 0x20CED, 0x20CFF, 0x20D15, 0x20D28,
+        0x20D31, 0x20D32, 0x20D46, 0x20D47, 0x20D48, 0x20D49,
+        0x20D4C, 0x20D4D, 0x20D4E, 0x20D6F, 0x20D71, 0x20D74,
+        0x20D7C, 0x20D7E, 0x20D7F, 0x20D96, 0x20D9C, 0x20DA7,
+        0x20DB2, 0x20DC8, 0x20E04, 0x20E09, 0x20E0A, 0x20E0D,
+        0x20E0E, 0x20E0F, 0x20E10, 0x20E11, 0x20E16, 0x20E1D,
+        0x20E4C, 0x20E6D, 0x20E73, 0x20E75, 0x20E76, 0x20E77,
+        0x20E78, 0x20E79, 0x20E7A, 0x20E7B, 0x20E8C, 0x20E96,
+        0x20E98, 0x20E9D, 0x20EA2, 0x20EAA, 0x20EAB, 0x20EAC,
+        0x20EB6, 0x20ED7, 0x20ED8, 0x20EDD, 0x20EF8, 0x20EF9,
+        0x20EFA, 0x20EFB, 0x20F1D, 0x20F26, 0x20F2D, 0x20F2E,
+        0x20F30, 0x20F31, 0x20F3B, 0x20F4C, 0x20F64, 0x20F8D,
+        0x20F90, 0x20FAD, 0x20FB4, 0x20FB5, 0x20FB6, 0x20FBC,
+        0x20FDF, 0x20FEA, 0x20FEB, 0x20FEC, 0x20FED, 0x21014,
+        0x2101D, 0x2101E, 0x2104F, 0x2105C, 0x2106F, 0x21075,
+        0x21076, 0x21077, 0x21078, 0x2107B, 0x21088, 0x21096,
+        0x2109D, 0x210B4, 0x210BF, 0x210C0, 0x210C1, 0x210C7,
+        0x210C8, 0x210C9, 0x210CF, 0x210D3, 0x210E4, 0x210F4,
+        0x210F5, 0x210F6, 0x2112F, 0x2113B, 0x2113D, 0x21145,
+        0x21148, 0x2114F, 0x21180, 0x21187, 0x211D9, 0x2123C,
+        0x2124F, 0x2127C, 0x212A8, 0x212A9, 0x212B0, 0x212E3,
+        0x212FE, 0x21302, 0x21303, 0x21304, 0x21305, 0x21336,
+        0x2133A, 0x21375, 0x21376, 0x2138E, 0x21398, 0x2139C,
+        0x213C5, 0x213C6, 0x213ED, 0x213FE, 0x21413, 0x21416,
+        0x21424, 0x2143F, 0x21452, 0x21454, 0x21455, 0x2148A,
+        0x21497, 0x214B6, 0x214E8, 0x214FD, 0x21577, 0x21582,
+        0x21596, 0x2160A, 0x21613, 0x21619, 0x2163E, 0x21661,
+        0x21692, 0x216B8, 0x216BA, 0x216C0, 0x216C1, 0x216C2,
+        0x216D3, 0x216D5, 0x216DF, 0x216E6, 0x216E7, 0x216E8,
+        0x216FA, 0x216FB, 0x216FC, 0x216FE, 0x2170D, 0x21710,
+        0x21726, 0x2173A, 0x2173B, 0x2173C, 0x21757, 0x2176C,
+        0x2176D, 0x2176E, 0x2176F, 0x21770, 0x21771, 0x21773,
+        0x21774, 0x217AB, 0x217B0, 0x217B1, 0x217B2, 0x217B3,
+        0x217B4, 0x217B5, 0x217C3, 0x217C7, 0x217D9, 0x217DA,
+        0x217DB, 0x217DC, 0x217DF, 0x217EF, 0x217F5, 0x217F6,
+        0x217F8, 0x217F9, 0x217FA, 0x217FB, 0x217FC, 0x21820,
+        0x21828, 0x21829, 0x2182A, 0x2182D, 0x21839, 0x2183A,
+        0x2183B, 0x21840, 0x21845, 0x21852, 0x2185E, 0x21861,
+        0x21862, 0x21863, 0x21864, 0x21877, 0x2187B, 0x21883,
+        0x21884, 0x21885, 0x2189E, 0x2189F, 0x218A0, 0x218A1,
+        0x218A2, 0x218BE, 0x218BF, 0x218D1, 0x218D6, 0x218D7,
+        0x218D8, 0x218D9, 0x218FA, 0x21903, 0x21904, 0x21905,
+        0x21910, 0x21911, 0x21912, 0x21915, 0x2191C, 0x21922,
+        0x21927, 0x2193B, 0x21944, 0x21958, 0x2196A, 0x2197C,
+        0x21980, 0x21983, 0x21988, 0x21996, 0x219DB, 0x219F3,
+        0x21A2D, 0x21A34, 0x21A45, 0x21A4B, 0x21B44, 0x21BC1,
+        0x21BC2, 0x21C2A, 0x21C70, 0x21CA2, 0x21CA5, 0x21CAC,
+        0x21D46, 0x21D90, 0x21DB6, 0x21DBA, 0x21DCA, 0x21DD1,
+        0x21DEB, 0x21DF9, 0x21E1C, 0x21E37, 0x21E3D, 0x21E89,
+        0x21EA4, 0x21EA8, 0x21EC8, 0x21ED5, 0x21F0F, 0x21F15,
+        0x21F6A, 0x21F9E, 0x21FA1, 0x21FE8, 0x22045, 0x22049,
+        0x2207E, 0x2209A, 0x220C7, 0x220FC, 0x2212A, 0x2215B,
+        0x22173, 0x2217A, 0x221A1, 0x221C3, 0x22208, 0x2227C,
+        0x22321, 0x22325, 0x223BD, 0x223D0, 0x223D7, 0x223FA,
+        0x22465, 0x22471, 0x2248B, 0x22491, 0x224B0, 0x224ED,
+        0x22513, 0x2251B, 0x22530, 0x22554, 0x2258D, 0x225AF,
+        0x225BE, 0x2261B, 0x2261C, 0x2262B, 0x22668, 0x2267A,
+        0x22696, 0x22698, 0x226F4, 0x226F5, 0x226F6, 0x22712,
+        0x22714, 0x2271B, 0x2271F, 0x2272A, 0x22775, 0x22781,
+        0x227B4, 0x227B5, 0x227CD, 0x22803, 0x2285F, 0x22860,
+        0x22871, 0x228AD, 0x228C1, 0x228F7, 0x22926, 0x22939,
+        0x2294F, 0x22967, 0x2296B, 0x22980, 0x22993, 0x22A66,
+        0x22ACF, 0x22AD5, 0x22AE6, 0x22AE8, 0x22B0E, 0x22B22,
+        0x22B3F, 0x22B43, 0x22B6A, 0x22BCA, 0x22BCE, 0x22C26,
+        0x22C27, 0x22C38, 0x22C4C, 0x22C51, 0x22C55, 0x22C62,
+        0x22C88, 0x22C9B, 0x22CA1, 0x22CA9, 0x22CB2, 0x22CB7,
+        0x22CC2, 0x22CC6, 0x22CC9, 0x22D07, 0x22D08, 0x22D12,
+        0x22D44, 0x22D4C, 0x22D67, 0x22D8D, 0x22D95, 0x22DA0,
+        0x22DA3, 0x22DA4, 0x22DB7, 0x22DEE, 0x22E0D, 0x22E36,
+        0x22E42, 0x22E78, 0x22E8B, 0x22EB3, 0x22EEF, 0x22F74,
+        0x22FCC, 0x22FE3, 0x23033, 0x23044, 0x2304B, 0x23066,
+        0x2307D, 0x2307E, 0x2308E, 0x230B7, 0x230BC, 0x230DA,
+        0x23103, 0x2313D, 0x2317D, 0x23182, 0x231A4, 0x231A5,
+        0x231B3, 0x231C8, 0x231C9, 0x231F7, 0x231F8, 0x231F9,
+        0x2320F, 0x23225, 0x2322F, 0x23231, 0x23232, 0x23233,
+        0x23234, 0x23262, 0x23281, 0x23289, 0x2328A, 0x232AB,
+        0x232AC, 0x232AD, 0x232D2, 0x232E0, 0x232E1, 0x23300,
+        0x2330A, 0x2331F, 0x233B4, 0x233CC, 0x233DE, 0x233E6,
+        0x233F4, 0x233F5, 0x233F9, 0x233FA, 0x233FE, 0x23400,
+        0x2343F, 0x23450, 0x2346F, 0x23472, 0x234E5, 0x23519,
+        0x23530, 0x2355A, 0x23567, 0x23595, 0x23599, 0x2359C,
+        0x235CD, 0x235CE, 0x235CF, 0x235F3, 0x23600, 0x2361A,
+        0x2363C, 0x23640, 0x23659, 0x2365F, 0x23677, 0x236A6,
+        0x236AD, 0x236BA, 0x236DF, 0x236EE, 0x23703, 0x23716,
+        0x23720, 0x2372D, 0x2372F, 0x2373F, 0x23766, 0x23781,
+        0x237A2, 0x237BC, 0x237C2, 0x237D5, 0x237D6, 0x237D7,
+        0x2383A, 0x239C2, 0x23AA7, 0x23ADB, 0x23AEE, 0x23AFA,
+        0x23B5A, 0x23C63, 0x23C99, 0x23C9A, 0x23C9B, 0x23CB5,
+        0x23CB7, 0x23CC7, 0x23CC8, 0x23CC9, 0x23CFC, 0x23CFD,
+        0x23CFE, 0x23CFF, 0x23D40, 0x23D5B, 0x23D7E, 0x23D8F,
+        0x23DB6, 0x23DB7, 0x23DB8, 0x23DB9, 0x23DBA, 0x23DBB,
+        0x23DBC, 0x23DBD, 0x23DE3, 0x23DF8, 0x23E11, 0x23E2C,
+        0x23E2D, 0x23E2E, 0x23E2F, 0x23E30, 0x23E31, 0x23E39,
+        0x23E88, 0x23E89, 0x23E8A, 0x23E8B, 0x23EB9, 0x23EBF,
+        0x23ED7, 0x23EF7, 0x23EF8, 0x23EF9, 0x23EFA, 0x23EFB,
+        0x23EFC, 0x23F35, 0x23F41, 0x23F4A, 0x23F7F, 0x23F80,
+        0x23F81, 0x23F82, 0x23F8F, 0x23FB4, 0x23FB7, 0x23FC0,
+        0x23FC5, 0x23FEB, 0x23FEC, 0x23FED, 0x23FEE, 0x23FEF,
+        0x23FF0, 0x24011, 0x24039, 0x2403A, 0x2403B, 0x2403C,
+        0x2403D, 0x24057, 0x24085, 0x2408B, 0x2408C, 0x2408D,
+        0x24091, 0x240C9, 0x240E1, 0x24104, 0x2410F, 0x24119,
+        0x2413F, 0x24140, 0x24144, 0x2414E, 0x24155, 0x24156,
+        0x24157, 0x2415C, 0x2415F, 0x24177, 0x2417A, 0x241A3,
+        0x241A4, 0x241A5, 0x241AC, 0x241B5, 0x241CD, 0x241E2,
+        0x241FC, 0x2421B, 0x2424B, 0x24256, 0x24259, 0x24276,
+        0x24277, 0x24278, 0x24284, 0x24293, 0x24295, 0x242A5,
+        0x242C1, 0x242C9, 0x242CA, 0x242EE, 0x242FA, 0x2430D,
+        0x2431A, 0x24334, 0x24348, 0x24362, 0x24363, 0x24364,
+        0x24365, 0x2438C, 0x24396, 0x2439C, 0x243BD, 0x243C1,
+        0x243E9, 0x243EA, 0x243F2, 0x243F8, 0x24404, 0x24435,
+        0x24436, 0x2445A, 0x2445B, 0x24473, 0x24487, 0x24488,
+        0x244B9, 0x244BC, 0x244CE, 0x244D3, 0x244D6, 0x24505,
+        0x24521, 0x24578, 0x245C8, 0x24618, 0x2462A, 0x24665,
+        0x24674, 0x24697, 0x246D4, 0x24706, 0x24725, 0x2472F,
+        0x2478F, 0x247E0, 0x24812, 0x24823, 0x24882, 0x248E9,
+        0x248F0, 0x248F1, 0x248F2, 0x248F3, 0x248FB, 0x248FF,
+        0x24900, 0x24901, 0x2490C, 0x24916, 0x24917, 0x24919,
+        0x2492F, 0x24933, 0x24934, 0x2493E, 0x2493F, 0x24940,
+        0x24941, 0x24942, 0x24943, 0x24962, 0x24963, 0x24974,
+        0x24975, 0x24976, 0x2497B, 0x2497F, 0x24982, 0x24988,
+        0x24989, 0x2498A, 0x2498B, 0x2498C, 0x2498D, 0x2498E,
+        0x2498F, 0x24994, 0x249A4, 0x249A7, 0x249A9, 0x249AB,
+        0x249AC, 0x249AD, 0x249B7, 0x249B8, 0x249B9, 0x249BA,
+        0x249BB, 0x249C5, 0x249D0, 0x249DA, 0x249DE, 0x249DF,
+        0x249E3, 0x249E5, 0x249EC, 0x249ED, 0x249F6, 0x249F7,
+        0x249F8, 0x249F9, 0x249FB, 0x24A0E, 0x24A12, 0x24A13,
+        0x24A15, 0x24A21, 0x24A22, 0x24A23, 0x24A24, 0x24A25,
+        0x24A26, 0x24A27, 0x24A28, 0x24A29, 0x24A2A, 0x24A3E,
+        0x24A42, 0x24A45, 0x24A4A, 0x24A4E, 0x24A4F, 0x24A50,
+        0x24A51, 0x24A5D, 0x24A65, 0x24A66, 0x24A67, 0x24A71,
+        0x24A77, 0x24A78, 0x24A79, 0x24A7A, 0x24A8C, 0x24A93,
+        0x24A94, 0x24A95, 0x24A96, 0x24AA4, 0x24AA5, 0x24AA6,
+        0x24AA7, 0x24AB1, 0x24AB2, 0x24AB3, 0x24ABA, 0x24ABB,
+        0x24ABC, 0x24AC0, 0x24AC7, 0x24ACA, 0x24AD1, 0x24ADF,
+        0x24AE2, 0x24AE9, 0x24B6E, 0x24BF5, 0x24C09, 0x24C9E,
+        0x24C9F, 0x24CC9, 0x24CD9, 0x24D06, 0x24D13, 0x24DB8,
+        0x24DEA, 0x24DEB, 0x24E3B, 0x24E50, 0x24EA5, 0x24EA7,
+        0x24F0E, 0x24F5C, 0x24F82, 0x24F86, 0x24F97, 0x24F9A,
+        0x24FA9, 0x24FB8, 0x24FC2, 0x2502C, 0x25052, 0x2509D,
+        0x2512B, 0x25148, 0x2517D, 0x2517E, 0x251CD, 0x251E3,
+        0x251E6, 0x251E7, 0x25220, 0x25221, 0x25250, 0x25299,
+        0x252C7, 0x252D8, 0x2530E, 0x25311, 0x25313, 0x25419,
+        0x25425, 0x2542F, 0x25430, 0x25446, 0x2546C, 0x2546E,
+        0x25531, 0x25535, 0x2553F, 0x2555B, 0x2555C, 0x2555D,
+        0x2555E, 0x25562, 0x25565, 0x25566, 0x25581, 0x25584,
+        0x2558F, 0x255B9, 0x255D5, 0x255DB, 0x255E0, 0x25605,
+        0x25635, 0x25651, 0x25683, 0x25695, 0x256E3, 0x256F6,
+        0x25706, 0x2571D, 0x25725, 0x2573D, 0x25772, 0x257C7,
+        0x257DF, 0x257E0, 0x257E1, 0x25857, 0x2585D, 0x25872,
+        0x258C8, 0x258E1, 0x25903, 0x25946, 0x25956, 0x259AC,
+        0x259CC, 0x25A95, 0x25A9C, 0x25AAE, 0x25AAF, 0x25AE9,
+        0x25B74, 0x25B89, 0x25BB3, 0x25BB4, 0x25BC6, 0x25BE4,
+        0x25BE8, 0x25C01, 0x25C06, 0x25C21, 0x25C4A, 0x25C65,
+        0x25C91, 0x25CA4, 0x25CC0, 0x25CC1, 0x25CFE, 0x25D20,
+        0x25D30, 0x25D43, 0x25E0E, 0x25E49, 0x25E81, 0x25E82,
+        0x25E83, 0x25EA6, 0x25EBC, 0x25ED7, 0x25ED8, 0x25F1A,
+        0x25F4B, 0x25FE1, 0x25FE2, 0x26029, 0x26048, 0x26064,
+        0x26083, 0x26097, 0x260A4, 0x260A5, 0x26102, 0x26121,
+        0x26159, 0x2615A, 0x2615B, 0x2615C, 0x261AD, 0x261AE,
+        0x261B2, 0x261DD, 0x26258, 0x26261, 0x2626A, 0x2626B,
+        0x262D0, 0x26335, 0x2634B, 0x2634C, 0x26351, 0x263BE,
+        0x263F5, 0x263F8, 0x26402, 0x26410, 0x26411, 0x26412,
+        0x2644A, 0x26469, 0x26484, 0x26488, 0x26489, 0x2648D,
+        0x26498, 0x26512, 0x26572, 0x265A0, 0x265AD, 0x265BF,
+        0x26612, 0x26626, 0x266AF, 0x266B1, 0x266B5, 0x266DA,
+        0x266E8, 0x266FC, 0x26716, 0x26741, 0x26799, 0x267B3,
+        0x267B4, 0x267CC, 0x2681C, 0x26846, 0x2685E, 0x2686E,
+        0x26888, 0x2688A, 0x26893, 0x268C7, 0x2690E, 0x26911,
+        0x26926, 0x26939, 0x26951, 0x269A8, 0x269B5, 0x269F2,
+        0x269FA, 0x26A2D, 0x26A2E, 0x26A34, 0x26A42, 0x26A51,
+        0x26A52, 0x26B05, 0x26B0A, 0x26B13, 0x26B15, 0x26B28,
+        0x26B50, 0x26B51, 0x26B52, 0x26B53, 0x26B5B, 0x26B75,
+        0x26B82, 0x26B96, 0x26B97, 0x26B9D, 0x26BB3, 0x26BC0,
+        0x26BF7, 0x26C21, 0x26C40, 0x26C7E, 0x26C7F, 0x26C80,
+        0x26C81, 0x26C82, 0x26CA4, 0x26CB7, 0x26CB8, 0x26CBD,
+        0x26CC0, 0x26CC3, 0x26CD1, 0x26D22, 0x26D23, 0x26D24,
+        0x26D25, 0x26D26, 0x26D27, 0x26D28, 0x26D29, 0x26D2A,
+        0x26D51, 0x26D74, 0x26DA0, 0x26DA1, 0x26DA2, 0x26DA3,
+        0x26DA4, 0x26DA5, 0x26DA6, 0x26DA7, 0x26DAE, 0x26DDC,
+        0x26DEA, 0x26DEB, 0x26DF0, 0x26E00, 0x26E05, 0x26E07,
+        0x26E12, 0x26E42, 0x26E43, 0x26E44, 0x26E45, 0x26E6E,
+        0x26E72, 0x26E77, 0x26E84, 0x26E99, 0x26ED0, 0x26ED1,
+        0x26ED2, 0x26ED3, 0x26ED4, 0x26ED5, 0x26ED6, 0x26ED7,
+        0x26F26, 0x26F73, 0x26F74, 0x26F9F, 0x26FA1, 0x26FBE,
+        0x26FDE, 0x26FDF, 0x2700E, 0x2704B, 0x27052, 0x27053,
+        0x27088, 0x270AD, 0x270AE, 0x270AF, 0x270CD, 0x270F8,
+        0x27109, 0x2710C, 0x2710D, 0x27126, 0x27127, 0x27164,
+        0x27165, 0x27175, 0x271CD, 0x2721B, 0x27280, 0x27285,
+        0x2728B, 0x272B2, 0x272B6, 0x272E6, 0x2739A, 0x27422,
+        0x27450, 0x27484, 0x27486, 0x27574, 0x275A3, 0x275E0,
+        0x275E4, 0x275FD, 0x275FE, 0x27607, 0x2760C, 0x27632,
+        0x27639, 0x27655, 0x27656, 0x27657, 0x27694, 0x2770F,
+        0x27735, 0x27736, 0x27741, 0x2775E, 0x27784, 0x27785,
+        0x277CC, 0x27858, 0x27870, 0x2789D, 0x278B2, 0x278C8,
+        0x27924, 0x27967, 0x2797A, 0x279A0, 0x279DD, 0x279FD,
+        0x27A0A, 0x27A0E, 0x27A3E, 0x27A53, 0x27A59, 0x27A79,
+        0x27A84, 0x27ABD, 0x27ABE, 0x27AF4, 0x27B06, 0x27B0B,
+        0x27B18, 0x27B38, 0x27B39, 0x27B3A, 0x27B48, 0x27BF4,
+        0x27C12, 0x27D2F, 0x27D53, 0x27D54, 0x27D66, 0x27D73,
+        0x27D84, 0x27D8F, 0x27D98, 0x27DBD, 0x27DDC, 0x27E4D,
+        0x27E4F, 0x27FF9, 0x28002, 0x28009, 0x2801E, 0x28023,
+        0x28024, 0x28048, 0x28083, 0x28090, 0x280BD, 0x280BE,
+        0x280E8, 0x280E9, 0x280F4, 0x2812E, 0x2814F, 0x2815D,
+        0x2816F, 0x28189, 0x281AF, 0x281BC, 0x28207, 0x28218,
+        0x2821A, 0x28256, 0x2827C, 0x2829B, 0x282CD, 0x282E2,
+        0x28306, 0x28318, 0x2832F, 0x2833A, 0x28365, 0x2836D,
+        0x2837D, 0x2838A, 0x28412, 0x28468, 0x2846C, 0x28473,
+        0x28482, 0x28501, 0x2853C, 0x2853D, 0x2856C, 0x285E8,
+        0x285F4, 0x28600, 0x2860B, 0x28625, 0x2863B, 0x286AA,
+        0x286AB, 0x286BC, 0x286D8, 0x286E6, 0x2870F, 0x28713,
+        0x28804, 0x2882B, 0x28933, 0x28948, 0x28949, 0x28956,
+        0x28964, 0x28968, 0x2896C, 0x2897E, 0x28989, 0x289A8,
+        0x289AA, 0x289AB, 0x289B8, 0x289BC, 0x289C0, 0x289DC,
+        0x289DE, 0x289E1, 0x289E3, 0x289E4, 0x289E7, 0x289E8,
+        0x289F9, 0x289FA, 0x289FB, 0x289FC, 0x28A0F, 0x28A16,
+        0x28A25, 0x28A29, 0x28A32, 0x28A36, 0x28A44, 0x28A45,
+        0x28A46, 0x28A47, 0x28A48, 0x28A49, 0x28A4A, 0x28A4B,
+        0x28A59, 0x28A5A, 0x28A81, 0x28A82, 0x28A83, 0x28A9A,
+        0x28A9B, 0x28A9C, 0x28AC0, 0x28AC6, 0x28ACB, 0x28ACC,
+        0x28ACE, 0x28ADE, 0x28ADF, 0x28AE0, 0x28AE1, 0x28AE2,
+        0x28AE3, 0x28AE5, 0x28AEA, 0x28AFC, 0x28B0C, 0x28B13,
+        0x28B21, 0x28B22, 0x28B2B, 0x28B2C, 0x28B2D, 0x28B2F,
+        0x28B46, 0x28B4C, 0x28B4E, 0x28B50, 0x28B63, 0x28B64,
+        0x28B65, 0x28B66, 0x28B6C, 0x28B8F, 0x28B99, 0x28B9C,
+        0x28B9D, 0x28BC2, 0x28BC5, 0x28BD4, 0x28BD7, 0x28BD9,
+        0x28BDA, 0x28BE7, 0x28BE8, 0x28BE9, 0x28BEA, 0x28BEB,
+        0x28BEC, 0x28BF5, 0x28BFF, 0x28C03, 0x28C09, 0x28C1C,
+        0x28C1D, 0x28C23, 0x28C26, 0x28C2B, 0x28C30, 0x28C39,
+        0x28C3B, 0x28CCA, 0x28CCD, 0x28CD2, 0x28D34, 0x28D99,
+        0x28DB9, 0x28E0F, 0x28E36, 0x28E39, 0x28E65, 0x28E66,
+        0x28E97, 0x28EAC, 0x28EB2, 0x28EB3, 0x28ED9, 0x28EE7,
+        0x28FC5, 0x29088, 0x2908B, 0x29093, 0x290AF, 0x290B0,
+        0x290B1, 0x290C0, 0x290E4, 0x290E5, 0x290EC, 0x290ED,
+        0x2910D, 0x29110, 0x2913C, 0x2914D, 0x2915B, 0x2915E,
+        0x29170, 0x2919C, 0x291A8, 0x291D5, 0x291EB, 0x2941D,
+        0x29420, 0x29433, 0x2943F, 0x29448, 0x294D0, 0x294D9,
+        0x294DA, 0x294E5, 0x294E7, 0x2959E, 0x295B0, 0x295B8,
+        0x295D7, 0x295E9, 0x295F4, 0x29720, 0x29732, 0x297D4,
+        0x29810, 0x29857, 0x298A4, 0x298D1, 0x298EA, 0x298F1,
+        0x29903, 0x29905, 0x2992F, 0x29947, 0x29948, 0x29949,
+        0x2995D, 0x2996A, 0x2999D, 0x299C3, 0x299C9, 0x29A28,
+        0x29A4D, 0x29B05, 0x29B0E, 0x29BD5, 0x29C73, 0x29CAD,
+        0x29D3E, 0x29D5A, 0x29D7C, 0x29D98, 0x29D9B, 0x29DF6,
+        0x29E06, 0x29E2D, 0x29E68, 0x29EAC, 0x29EC3, 0x29EF8,
+        0x29F23, 0x29F30, 0x29FB7, 0x29FDE, 0x2A014, 0x2A087,
+        0x2A0B9, 0x2A0E1, 0x2A0ED, 0x2A0F3, 0x2A0F8, 0x2A0FE,
+        0x2A107, 0x2A123, 0x2A133, 0x2A134, 0x2A150, 0x2A192,
+        0x2A193, 0x2A1AB, 0x2A1B4, 0x2A1DF, 0x2A1F5, 0x2A220,
+        0x2A233, 0x2A293, 0x2A29F, 0x2A2B2, 0x2A2B4, 0x2A2B6,
+        0x2A2BA, 0x2A2BD, 0x2A2DF, 0x2A2FF, 0x2A3A9, 0x2A434,
+        0x2A45B, 0x2A5C6, 0x2A5CB, 0x2A601, 0x2A632, 0x2A64A,
+        0x2A65B, 0x2A6A9, 0x2F825, 0x2F83B, 0x2F840, 0x2F878,
+        0x2F894, 0x2F8A6, 0x2F8CD, 0x2F994, 0x2F9B2, 0x2F9BC,
+        0x2F9D4 };
+
+    /**
+     * Big5-HKSCS native encoded equivalent for the
+     * surrogate pair input provided above within the
+     * String constant "surrogates"
+     */
+
+    final static byte[] expectBytes = {
+        (byte)0x9C, (byte)0x71, (byte)0x93, (byte)0x75,
+        (byte)0x93, (byte)0x76, (byte)0x95, (byte)0x48,
+        (byte)0x8E, (byte)0xC6, (byte)0x8B, (byte)0xC5,
+        (byte)0x8B, (byte)0xFA, (byte)0xC8, (byte)0x7C,
+        (byte)0x9A, (byte)0xB4, (byte)0x88, (byte)0x4E,
+        (byte)0x88, (byte)0x4B, (byte)0xC8, (byte)0x7A,
+        (byte)0x88, (byte)0x48, (byte)0x88, (byte)0x47,
+        (byte)0xA0, (byte)0xF6, (byte)0x88, (byte)0x45,
+        (byte)0x88, (byte)0x53, (byte)0xFC, (byte)0xAD,
+        (byte)0x8A, (byte)0xAD, (byte)0x92, (byte)0x72,
+        (byte)0xFC, (byte)0x47, (byte)0x94, (byte)0xDF,
+        (byte)0x9F, (byte)0xD1, (byte)0xFB, (byte)0xCB,
+        (byte)0x92, (byte)0x7D, (byte)0x98, (byte)0xA4,
+        (byte)0x94, (byte)0xE7, (byte)0x90, (byte)0xCB,
+        (byte)0x92, (byte)0x7B, (byte)0x94, (byte)0xD8,
+        (byte)0xFC, (byte)0x5F, (byte)0xFA, (byte)0x54,
+        (byte)0x9A, (byte)0xB5, (byte)0x96, (byte)0xDA,
+        (byte)0x92, (byte)0x79, (byte)0xFA, (byte)0x74,
+        (byte)0x92, (byte)0x75, (byte)0x8D, (byte)0xFB,
+        (byte)0x8A, (byte)0x49, (byte)0x92, (byte)0xDF,
+        (byte)0x9B, (byte)0x7C, (byte)0xFA, (byte)0x63,
+        (byte)0xFA, (byte)0x60, (byte)0x92, (byte)0x6D,
+        (byte)0xFA, (byte)0x62, (byte)0x9A, (byte)0xB6,
+        (byte)0x97, (byte)0x6B, (byte)0xFD, (byte)0x6A,
+        (byte)0xFD, (byte)0x54, (byte)0x92, (byte)0x73,
+        (byte)0x97, (byte)0xD8, (byte)0x9F, (byte)0xBB,
+        (byte)0x93, (byte)0x42, (byte)0x92, (byte)0x76,
+        (byte)0xFA, (byte)0x65, (byte)0x92, (byte)0x6C,
+        (byte)0xFA, (byte)0x6E, (byte)0x9E, (byte)0xE0,
+        (byte)0x92, (byte)0xC0, (byte)0x92, (byte)0xBF,
+        (byte)0x92, (byte)0xBE, (byte)0x9A, (byte)0xBA,
+        (byte)0x8A, (byte)0xB3, (byte)0x97, (byte)0x75,
+        (byte)0xFA, (byte)0x40, (byte)0xFA, (byte)0x76,
+        (byte)0xFB, (byte)0xD0, (byte)0xFA, (byte)0x7B,
+        (byte)0xFE, (byte)0x6D, (byte)0x9B, (byte)0xB3,
+        (byte)0x89, (byte)0xCC, (byte)0x9A, (byte)0xBE,
+        (byte)0xFA, (byte)0x42, (byte)0x92, (byte)0xBC,
+        (byte)0x94, (byte)0x5C, (byte)0x9B, (byte)0xB5,
+        (byte)0x9A, (byte)0xBF, (byte)0x98, (byte)0xA7,
+        (byte)0x97, (byte)0xA4, (byte)0x90, (byte)0xFD,
+        (byte)0xFC, (byte)0x7B, (byte)0x9A, (byte)0xC0,
+        (byte)0x92, (byte)0xC3, (byte)0x8A, (byte)0xAA,
+        (byte)0x9B, (byte)0xD0, (byte)0x95, (byte)0x50,
+        (byte)0x92, (byte)0xC6, (byte)0x98, (byte)0xA6,
+        (byte)0x95, (byte)0x46, (byte)0xFD, (byte)0x63,
+        (byte)0xFA, (byte)0xC2, (byte)0x9E, (byte)0xC3,
+        (byte)0x89, (byte)0xB2, (byte)0x9C, (byte)0x66,
+        (byte)0x90, (byte)0x53, (byte)0x97, (byte)0xC1,
+        (byte)0x9A, (byte)0xC4, (byte)0x9A, (byte)0xC5,
+        (byte)0x8E, (byte)0xEF, (byte)0xFA, (byte)0xE9,
+        (byte)0x92, (byte)0x62, (byte)0x8A, (byte)0xF7,
+        (byte)0x9A, (byte)0xC6, (byte)0x92, (byte)0xE1,
+        (byte)0x9A, (byte)0xC9, (byte)0xFA, (byte)0xC6,
+        (byte)0x97, (byte)0xA5, (byte)0x9A, (byte)0xCB,
+        (byte)0xFA, (byte)0x72, (byte)0x8A, (byte)0x5E,
+        (byte)0x94, (byte)0xE0, (byte)0x92, (byte)0xCC,
+        (byte)0x8A, (byte)0xE5, (byte)0xFE, (byte)0x5C,
+        (byte)0x9A, (byte)0xCC, (byte)0x9D, (byte)0xF9,
+        (byte)0x8A, (byte)0x43, (byte)0x8A, (byte)0xA6,
+        (byte)0x9A, (byte)0xCD, (byte)0x9A, (byte)0xCE,
+        (byte)0xFA, (byte)0xEE, (byte)0x9B, (byte)0xCC,
+        (byte)0x9A, (byte)0xCF, (byte)0x9A, (byte)0xD1,
+        (byte)0x9D, (byte)0xFA, (byte)0x9D, (byte)0x7C,
+        (byte)0x9A, (byte)0xD3, (byte)0x97, (byte)0xA6,
+        (byte)0x99, (byte)0x5F, (byte)0xFB, (byte)0xF6,
+        (byte)0x9F, (byte)0xC5, (byte)0x8A, (byte)0x59,
+        (byte)0x8B, (byte)0x6B, (byte)0x9A, (byte)0xD4,
+        (byte)0x9A, (byte)0xD5, (byte)0x97, (byte)0xA2,
+        (byte)0x8A, (byte)0x44, (byte)0x9F, (byte)0x4A,
+        (byte)0x90, (byte)0xA1, (byte)0xFD, (byte)0xA4,
+        (byte)0x8A, (byte)0x64, (byte)0x8A, (byte)0xF2,
+        (byte)0x8A, (byte)0xF8, (byte)0x9D, (byte)0xD8,
+        (byte)0x94, (byte)0xD6, (byte)0xFA, (byte)0xFE,
+        (byte)0xFB, (byte)0xA7, (byte)0x9A, (byte)0xD6,
+        (byte)0x9F, (byte)0x4D, (byte)0xFA, (byte)0xF6,
+        (byte)0x8A, (byte)0x57, (byte)0x8B, (byte)0x43,
+        (byte)0x8B, (byte)0x44, (byte)0x8A, (byte)0xB6,
+        (byte)0x8A, (byte)0xC0, (byte)0x9E, (byte)0x54,
+        (byte)0x9A, (byte)0xD7, (byte)0x9A, (byte)0xD8,
+        (byte)0x9A, (byte)0xDC, (byte)0x8A, (byte)0xCA,
+        (byte)0x9E, (byte)0xA8, (byte)0x92, (byte)0x63,
+        (byte)0x9A, (byte)0xDD, (byte)0x8B, (byte)0x65,
+        (byte)0x8B, (byte)0x6F, (byte)0x8B, (byte)0x7E,
+        (byte)0x8F, (byte)0x43, (byte)0x92, (byte)0xD0,
+        (byte)0x8A, (byte)0xF4, (byte)0x9D, (byte)0xBE,
+        (byte)0x9A, (byte)0xE1, (byte)0xFC, (byte)0xDE,
+        (byte)0x9D, (byte)0xFD, (byte)0x8B, (byte)0x66,
+        (byte)0x8B, (byte)0x70, (byte)0x8B, (byte)0x75,
+        (byte)0x8A, (byte)0xE4, (byte)0x8B, (byte)0xA4,
+        (byte)0x8A, (byte)0xED, (byte)0x8A, (byte)0x5D,
+        (byte)0x8B, (byte)0x48, (byte)0x9D, (byte)0xED,
+        (byte)0x9E, (byte)0x40, (byte)0x8A, (byte)0xEF,
+        (byte)0x8A, (byte)0xF6, (byte)0x9E, (byte)0x76,
+        (byte)0x9E, (byte)0xE3, (byte)0x9A, (byte)0xDE,
+        (byte)0x8D, (byte)0xFE, (byte)0xFA, (byte)0xFC,
+        (byte)0x9C, (byte)0xB1, (byte)0x9E, (byte)0x77,
+        (byte)0x8B, (byte)0x64, (byte)0x8B, (byte)0x67,
+        (byte)0x97, (byte)0x4B, (byte)0x96, (byte)0x53,
+        (byte)0x9A, (byte)0xE0, (byte)0x8B, (byte)0x4A,
+        (byte)0x8A, (byte)0xF1, (byte)0x8A, (byte)0xD7,
+        (byte)0xA0, (byte)0xAB, (byte)0x8A, (byte)0xB5,
+        (byte)0x8A, (byte)0x5F, (byte)0x8A, (byte)0xEE,
+        (byte)0x9A, (byte)0xDF, (byte)0x8A, (byte)0xFE,
+        (byte)0x8A, (byte)0x58, (byte)0x8B, (byte)0xA3,
+        (byte)0x8B, (byte)0xA7, (byte)0x9A, (byte)0xE3,
+        (byte)0x92, (byte)0x61, (byte)0x9D, (byte)0xD7,
+        (byte)0x9E, (byte)0x7D, (byte)0x9E, (byte)0xA7,
+        (byte)0x9E, (byte)0xAB, (byte)0x90, (byte)0x42,
+        (byte)0x8B, (byte)0x79, (byte)0x8B, (byte)0x7A,
+        (byte)0x9A, (byte)0xE6, (byte)0x9A, (byte)0xE5,
+        (byte)0x8A, (byte)0x7E, (byte)0x9E, (byte)0x44,
+        (byte)0x9A, (byte)0xE7, (byte)0x8A, (byte)0x7C,
+        (byte)0x8B, (byte)0x71, (byte)0x9A, (byte)0xE9,
+        (byte)0x9A, (byte)0xEA, (byte)0x9A, (byte)0xEB,
+        (byte)0x8A, (byte)0xBD, (byte)0xFB, (byte)0x4E,
+        (byte)0x9A, (byte)0xED, (byte)0x8A, (byte)0xF9,
+        (byte)0x9E, (byte)0x63, (byte)0x8B, (byte)0x49,
+        (byte)0x8A, (byte)0xCE, (byte)0x8B, (byte)0x6E,
+        (byte)0x8A, (byte)0xE8, (byte)0x9A, (byte)0xEE,
+        (byte)0x92, (byte)0xCE, (byte)0x8A, (byte)0x5A,
+        (byte)0x8B, (byte)0x7B, (byte)0x8B, (byte)0x7C,
+        (byte)0x9A, (byte)0xEF, (byte)0x9A, (byte)0xF0,
+        (byte)0x8A, (byte)0xFA, (byte)0x89, (byte)0x41,
+        (byte)0x8B, (byte)0x72, (byte)0x8A, (byte)0xF3,
+        (byte)0x8B, (byte)0xA8, (byte)0x9E, (byte)0xAE,
+        (byte)0x9E, (byte)0x72, (byte)0xFB, (byte)0x73,
+        (byte)0xFB, (byte)0x5F, (byte)0x90, (byte)0xBA,
+        (byte)0x91, (byte)0xFE, (byte)0x9E, (byte)0xF6,
+        (byte)0x97, (byte)0xED, (byte)0x9A, (byte)0xF3,
+        (byte)0xA0, (byte)0xEE, (byte)0x96, (byte)0x7C,
+        (byte)0x93, (byte)0x45, (byte)0x98, (byte)0x6E,
+        (byte)0xFA, (byte)0x56, (byte)0x9A, (byte)0xF5,
+        (byte)0xFC, (byte)0x4B, (byte)0x9A, (byte)0xF4,
+        (byte)0xFE, (byte)0xDE, (byte)0xFC, (byte)0xB7,
+        (byte)0x97, (byte)0xF1, (byte)0x97, (byte)0xC7,
+        (byte)0x9C, (byte)0xCB, (byte)0x92, (byte)0x40,
+        (byte)0x9C, (byte)0xE8, (byte)0x91, (byte)0xFD,
+        (byte)0x97, (byte)0x4E, (byte)0xFB, (byte)0x68,
+        (byte)0x97, (byte)0x6C, (byte)0x8C, (byte)0xC2,
+        (byte)0x97, (byte)0xE8, (byte)0xFB, (byte)0x6A,
+        (byte)0x8B, (byte)0x74, (byte)0x8E, (byte)0xE7,
+        (byte)0xFD, (byte)0xC8, (byte)0x92, (byte)0x41,
+        (byte)0x96, (byte)0xA1, (byte)0x8E, (byte)0xF3,
+        (byte)0x9A, (byte)0xF7, (byte)0x8F, (byte)0xA6,
+        (byte)0xFA, (byte)0xD6, (byte)0x9C, (byte)0xC7,
+        (byte)0xFA, (byte)0xD7, (byte)0x9A, (byte)0xF8,
+        (byte)0xFB, (byte)0xA1, (byte)0x8E, (byte)0xC5,
+        (byte)0xFB, (byte)0xA4, (byte)0xFB, (byte)0xC2,
+        (byte)0x9A, (byte)0xC1, (byte)0x91, (byte)0xFA,
+        (byte)0xFE, (byte)0xDB, (byte)0x97, (byte)0xAB,
+        (byte)0x91, (byte)0x47, (byte)0xFB, (byte)0xB1,
+        (byte)0x8F, (byte)0xEA, (byte)0x94, (byte)0xD2,
+        (byte)0xFE, (byte)0x61, (byte)0xFA, (byte)0xCE,
+        (byte)0x92, (byte)0xED, (byte)0x91, (byte)0xF3,
+        (byte)0x93, (byte)0xC6, (byte)0x93, (byte)0x5A,
+        (byte)0xFA, (byte)0xFB, (byte)0x92, (byte)0xEF,
+        (byte)0xFA, (byte)0xC8, (byte)0x98, (byte)0x47,
+        (byte)0x93, (byte)0x66, (byte)0x98, (byte)0x55,
+        (byte)0x96, (byte)0xE6, (byte)0x9F, (byte)0x43,
+        (byte)0x9F, (byte)0xAA, (byte)0x94, (byte)0xDA,
+        (byte)0x92, (byte)0xEE, (byte)0xFC, (byte)0xAF,
+        (byte)0xFB, (byte)0xFB, (byte)0x8E, (byte)0xF9,
+        (byte)0x91, (byte)0xF6, (byte)0x93, (byte)0x64,
+        (byte)0x94, (byte)0xF5, (byte)0x9C, (byte)0xB6,
+        (byte)0xFB, (byte)0xAD, (byte)0x98, (byte)0x4E,
+        (byte)0x8F, (byte)0x44, (byte)0x96, (byte)0xFD,
+        (byte)0x9A, (byte)0xF9, (byte)0x9A, (byte)0xFA,
+        (byte)0x97, (byte)0x69, (byte)0x95, (byte)0xD4,
+        (byte)0x98, (byte)0x4B, (byte)0xFB, (byte)0xAA,
+        (byte)0x98, (byte)0x7C, (byte)0x91, (byte)0xEA,
+        (byte)0x9D, (byte)0xAF, (byte)0x9D, (byte)0xC5,
+        (byte)0x91, (byte)0xF1, (byte)0x8E, (byte)0xB1,
+        (byte)0x97, (byte)0xA9, (byte)0xFB, (byte)0xAC,
+        (byte)0xFC, (byte)0xB8, (byte)0x9C, (byte)0xB9,
+        (byte)0xFB, (byte)0xB0, (byte)0xFC, (byte)0xD2,
+        (byte)0x93, (byte)0xCB, (byte)0x9A, (byte)0xFD,
+        (byte)0x91, (byte)0xF4, (byte)0x8B, (byte)0xAC,
+        (byte)0xA0, (byte)0x55, (byte)0x95, (byte)0x74,
+        (byte)0x95, (byte)0xBE, (byte)0x97, (byte)0xAD,
+        (byte)0x8E, (byte)0xE9, (byte)0x92, (byte)0xF8,
+        (byte)0x97, (byte)0xBE, (byte)0x91, (byte)0x6C,
+        (byte)0x94, (byte)0xAA, (byte)0xFC, (byte)0x63,
+        (byte)0x9D, (byte)0xC6, (byte)0x97, (byte)0xB5,
+        (byte)0x92, (byte)0xB8, (byte)0x91, (byte)0xEF,
+        (byte)0xFE, (byte)0xA6, (byte)0x97, (byte)0x60,
+        (byte)0x93, (byte)0x58, (byte)0x95, (byte)0x76,
+        (byte)0x8F, (byte)0xAC, (byte)0x91, (byte)0xEC,
+        (byte)0x97, (byte)0xB4, (byte)0x91, (byte)0xF7,
+        (byte)0x97, (byte)0x4A, (byte)0xFB, (byte)0x49,
+        (byte)0x95, (byte)0x78, (byte)0x93, (byte)0xBC,
+        (byte)0x91, (byte)0xD6, (byte)0x93, (byte)0x55,
+        (byte)0x93, (byte)0x56, (byte)0x98, (byte)0x51,
+        (byte)0x8F, (byte)0xF8, (byte)0xFB, (byte)0xC0,
+        (byte)0x93, (byte)0xF2, (byte)0x90, (byte)0xD0,
+        (byte)0x9C, (byte)0x44, (byte)0x92, (byte)0x55,
+        (byte)0x93, (byte)0x63, (byte)0x91, (byte)0xA5,
+        (byte)0xA0, (byte)0xED, (byte)0xFD, (byte)0x6B,
+        (byte)0x9A, (byte)0xFE, (byte)0x93, (byte)0x51,
+        (byte)0x8C, (byte)0x57, (byte)0xFA, (byte)0x78,
+        (byte)0xFE, (byte)0xA8, (byte)0x93, (byte)0x50,
+        (byte)0xFA, (byte)0x4C, (byte)0x92, (byte)0xF7,
+        (byte)0x9B, (byte)0x40, (byte)0xFB, (byte)0xCE,
+        (byte)0x9B, (byte)0x41, (byte)0xFE, (byte)0xAD,
+        (byte)0xFB, (byte)0xD5, (byte)0x8B, (byte)0xC2,
+        (byte)0x9A, (byte)0x7C, (byte)0x9B, (byte)0x42,
+        (byte)0x9B, (byte)0x43, (byte)0x9E, (byte)0x79,
+        (byte)0xFB, (byte)0xD9, (byte)0x9B, (byte)0x44,
+        (byte)0xA0, (byte)0xA7, (byte)0x9B, (byte)0xF3,
+        (byte)0x8C, (byte)0x79, (byte)0x93, (byte)0x5E,
+        (byte)0x89, (byte)0xCB, (byte)0x9F, (byte)0x53,
+        (byte)0x93, (byte)0xD7, (byte)0xFB, (byte)0xE1,
+        (byte)0xFE, (byte)0xD0, (byte)0xFB, (byte)0xE2,
+        (byte)0xFC, (byte)0xE3, (byte)0x90, (byte)0x74,
+        (byte)0xFB, (byte)0xE6, (byte)0x9B, (byte)0xB7,
+        (byte)0x9B, (byte)0x45, (byte)0x9B, (byte)0x47,
+        (byte)0x9F, (byte)0x50, (byte)0x9B, (byte)0x48,
+        (byte)0xFC, (byte)0x5B, (byte)0x98, (byte)0xA9,
+        (byte)0x9C, (byte)0xFD, (byte)0x88, (byte)0x4C,
+        (byte)0x9B, (byte)0x4B, (byte)0xFB, (byte)0xEC,
+        (byte)0x8C, (byte)0x69, (byte)0x9B, (byte)0xA8,
+        (byte)0x8A, (byte)0xD5, (byte)0xFA, (byte)0x73,
+        (byte)0xFD, (byte)0x59, (byte)0x91, (byte)0xA2,
+        (byte)0xFB, (byte)0xED, (byte)0x9C, (byte)0xA9,
+        (byte)0x8A, (byte)0xA8, (byte)0x9B, (byte)0xC3,
+        (byte)0x8A, (byte)0xE1, (byte)0x9B, (byte)0x4E,
+        (byte)0x95, (byte)0xD0, (byte)0x90, (byte)0x5F,
+        (byte)0x97, (byte)0xEE, (byte)0xFC, (byte)0x4E,
+        (byte)0x9B, (byte)0x4F, (byte)0x9B, (byte)0x50,
+        (byte)0x9E, (byte)0xC6, (byte)0xFC, (byte)0x50,
+        (byte)0xFD, (byte)0x73, (byte)0xFD, (byte)0xA7,
+        (byte)0x9D, (byte)0xA2, (byte)0xFA, (byte)0x58,
+        (byte)0xFA, (byte)0x5E, (byte)0xA0, (byte)0x59,
+        (byte)0xFA, (byte)0x75, (byte)0xFB, (byte)0xBE,
+        (byte)0x9C, (byte)0xA2, (byte)0x93, (byte)0x70,
+        (byte)0x93, (byte)0x71, (byte)0x93, (byte)0x77,
+        (byte)0xFE, (byte)0xEF, (byte)0x93, (byte)0x6D,
+        (byte)0xFC, (byte)0x5D, (byte)0x90, (byte)0xB8,
+        (byte)0x8A, (byte)0xFC, (byte)0xFB, (byte)0x41,
+        (byte)0x9E, (byte)0x6B, (byte)0x94, (byte)0xE3,
+        (byte)0x8E, (byte)0xE2, (byte)0x8C, (byte)0x7D,
+        (byte)0x8E, (byte)0xD7, (byte)0x9C, (byte)0x4D,
+        (byte)0x96, (byte)0xA3, (byte)0x9B, (byte)0x51,
+        (byte)0x8A, (byte)0xC3, (byte)0x96, (byte)0xAA,
+        (byte)0xFC, (byte)0x68, (byte)0x8B, (byte)0x6D,
+        (byte)0xFD, (byte)0x67, (byte)0x8A, (byte)0xE9,
+        (byte)0xFC, (byte)0xA1, (byte)0x93, (byte)0x6C,
+        (byte)0x9B, (byte)0x52, (byte)0xFE, (byte)0x70,
+        (byte)0xFC, (byte)0xA8, (byte)0xFC, (byte)0xE9,
+        (byte)0x9C, (byte)0xB4, (byte)0x8A, (byte)0xEA,
+        (byte)0x9B, (byte)0x53, (byte)0x9B, (byte)0x55,
+        (byte)0x96, (byte)0xAB, (byte)0xFC, (byte)0xA7,
+        (byte)0x9B, (byte)0x56, (byte)0x8A, (byte)0xBC,
+        (byte)0x8A, (byte)0xCB, (byte)0x9B, (byte)0x57,
+        (byte)0x89, (byte)0xCD, (byte)0x9B, (byte)0x59,
+        (byte)0x9B, (byte)0x5B, (byte)0x93, (byte)0xA5,
+        (byte)0x9B, (byte)0x5D, (byte)0x9E, (byte)0x4F,
+        (byte)0x93, (byte)0xA3, (byte)0x8A, (byte)0x7B,
+        (byte)0x8B, (byte)0x42, (byte)0x97, (byte)0x50,
+        (byte)0x8F, (byte)0xB3, (byte)0x8A, (byte)0x50,
+        (byte)0x9B, (byte)0x60, (byte)0x8B, (byte)0x45,
+        (byte)0x8B, (byte)0x46, (byte)0x9D, (byte)0xFE,
+        (byte)0x9B, (byte)0x62, (byte)0x93, (byte)0x7B,
+        (byte)0x93, (byte)0xB1, (byte)0x8A, (byte)0x60,
+        (byte)0x8A, (byte)0xD8, (byte)0x9B, (byte)0x63,
+        (byte)0x8A, (byte)0x69, (byte)0x8A, (byte)0x47,
+        (byte)0x8A, (byte)0xCC, (byte)0x93, (byte)0x7C,
+        (byte)0x9B, (byte)0x65, (byte)0x9B, (byte)0x66,
+        (byte)0x8A, (byte)0x72, (byte)0x8A, (byte)0x7A,
+        (byte)0x93, (byte)0xAF, (byte)0x8A, (byte)0xB0,
+        (byte)0x9B, (byte)0x68, (byte)0x9E, (byte)0xA3,
+        (byte)0xFA, (byte)0xEC, (byte)0x8B, (byte)0x77,
+        (byte)0x9B, (byte)0x67, (byte)0x8B, (byte)0x59,
+        (byte)0xFC, (byte)0xB1, (byte)0xFC, (byte)0xBB,
+        (byte)0x9B, (byte)0x69, (byte)0x93, (byte)0xA8,
+        (byte)0x8A, (byte)0xE0, (byte)0x9E, (byte)0x51,
+        (byte)0x8F, (byte)0x5F, (byte)0x9B, (byte)0x6A,
+        (byte)0x9B, (byte)0x6B, (byte)0x97, (byte)0xEC,
+        (byte)0x9B, (byte)0x6C, (byte)0xFE, (byte)0x4E,
+        (byte)0xFD, (byte)0xC2, (byte)0x9B, (byte)0x6D,
+        (byte)0x91, (byte)0x67, (byte)0xFC, (byte)0xCC,
+        (byte)0x93, (byte)0xB6, (byte)0x90, (byte)0xE4,
+        (byte)0x90, (byte)0xE5, (byte)0x9E, (byte)0xF2,
+        (byte)0x93, (byte)0xCA, (byte)0x8B, (byte)0xBC,
+        (byte)0x8F, (byte)0x46, (byte)0x93, (byte)0xCF,
+        (byte)0xFC, (byte)0xDB, (byte)0xFC, (byte)0xDC,
+        (byte)0x93, (byte)0xC0, (byte)0xFC, (byte)0xE6,
+        (byte)0x96, (byte)0xE7, (byte)0xFC, (byte)0xD8,
+        (byte)0xFC, (byte)0xD9, (byte)0xFD, (byte)0xA6,
+        (byte)0x93, (byte)0xCE, (byte)0x95, (byte)0xF1,
+        (byte)0x9C, (byte)0xE9, (byte)0xFC, (byte)0xE4,
+        (byte)0x94, (byte)0xAF, (byte)0xFA, (byte)0x77,
+        (byte)0x93, (byte)0xCC, (byte)0x90, (byte)0x5A,
+        (byte)0x8C, (byte)0x54, (byte)0x93, (byte)0xBF,
+        (byte)0xFB, (byte)0x51, (byte)0x93, (byte)0xB9,
+        (byte)0xFE, (byte)0xD7, (byte)0x93, (byte)0xB7,
+        (byte)0x93, (byte)0xD9, (byte)0x93, (byte)0xBB,
+        (byte)0x93, (byte)0xDA, (byte)0x98, (byte)0xA3,
+        (byte)0x90, (byte)0xD1, (byte)0x9B, (byte)0x6E,
+        (byte)0xFA, (byte)0x70, (byte)0x9B, (byte)0xEB,
+        (byte)0x9B, (byte)0x6F, (byte)0xFC, (byte)0xFC,
+        (byte)0x8B, (byte)0x40, (byte)0xA0, (byte)0x7B,
+        (byte)0x8C, (byte)0xA1, (byte)0x97, (byte)0xF7,
+        (byte)0x93, (byte)0xE2, (byte)0xFC, (byte)0xD6,
+        (byte)0x95, (byte)0x59, (byte)0x93, (byte)0xA6,
+        (byte)0xFD, (byte)0x40, (byte)0x93, (byte)0x5F,
+        (byte)0x97, (byte)0xF2, (byte)0x9C, (byte)0x76,
+        (byte)0x8E, (byte)0xF8, (byte)0x8F, (byte)0x47,
+        (byte)0x9B, (byte)0x74, (byte)0x92, (byte)0xB4,
+        (byte)0x91, (byte)0xED, (byte)0x96, (byte)0xD2,
+        (byte)0xFD, (byte)0x46, (byte)0x8F, (byte)0x4F,
+        (byte)0x95, (byte)0x49, (byte)0x9B, (byte)0x75,
+        (byte)0xFA, (byte)0x5C, (byte)0x9B, (byte)0x79,
+        (byte)0xFD, (byte)0x4B, (byte)0x96, (byte)0xD3,
+        (byte)0xFD, (byte)0x58, (byte)0x94, (byte)0x5F,
+        (byte)0xA0, (byte)0xF5, (byte)0x92, (byte)0x43,
+        (byte)0x97, (byte)0xFA, (byte)0x9D, (byte)0xD9,
+        (byte)0x97, (byte)0xF4, (byte)0x92, (byte)0x4D,
+        (byte)0xFD, (byte)0x5B, (byte)0x9B, (byte)0x7A,
+        (byte)0x9E, (byte)0xD5, (byte)0xFA, (byte)0xAE,
+        (byte)0x9C, (byte)0xC9, (byte)0x92, (byte)0x58,
+        (byte)0x8E, (byte)0xC8, (byte)0x94, (byte)0xB4,
+        (byte)0x93, (byte)0xE1, (byte)0x93, (byte)0xDF,
+        (byte)0xFC, (byte)0xF0, (byte)0x93, (byte)0xEC,
+        (byte)0x97, (byte)0xF6, (byte)0x96, (byte)0xCF,
+        (byte)0x93, (byte)0xDE, (byte)0x8A, (byte)0xCF,
+        (byte)0x9B, (byte)0xA2, (byte)0xFD, (byte)0x69,
+        (byte)0x93, (byte)0x52, (byte)0x98, (byte)0xA2,
+        (byte)0xFD, (byte)0x6E, (byte)0x8C, (byte)0xA4,
+        (byte)0xFA, (byte)0x7C, (byte)0x93, (byte)0xFA,
+        (byte)0x90, (byte)0x7C, (byte)0x8F, (byte)0x67,
+        (byte)0x9D, (byte)0xB7, (byte)0xA0, (byte)0xE9,
+        (byte)0xFA, (byte)0x4E, (byte)0xFD, (byte)0xA1,
+        (byte)0x9E, (byte)0x74, (byte)0x9F, (byte)0xBF,
+        (byte)0x9E, (byte)0xCB, (byte)0x9B, (byte)0xB9,
+        (byte)0x9D, (byte)0xD4, (byte)0x97, (byte)0xB9,
+        (byte)0x8E, (byte)0xF1, (byte)0x95, (byte)0x7B,
+        (byte)0x9E, (byte)0xD2, (byte)0x97, (byte)0x53,
+        (byte)0x96, (byte)0xA4, (byte)0x8F, (byte)0xBE,
+        (byte)0x94, (byte)0xD9, (byte)0x90, (byte)0x58,
+        (byte)0xFD, (byte)0x79, (byte)0xFD, (byte)0x7B,
+        (byte)0x8E, (byte)0xDA, (byte)0x8E, (byte)0xFA,
+        (byte)0x9B, (byte)0xA5, (byte)0x9E, (byte)0xD9,
+        (byte)0x97, (byte)0xD4, (byte)0x90, (byte)0xBB,
+        (byte)0xFD, (byte)0xBC, (byte)0xFD, (byte)0xC6,
+        (byte)0x92, (byte)0x48, (byte)0x92, (byte)0xB5,
+        (byte)0x9D, (byte)0xC1, (byte)0x92, (byte)0xB9,
+        (byte)0x92, (byte)0xA6, (byte)0x8F, (byte)0x4B,
+        (byte)0x9B, (byte)0xA6, (byte)0x92, (byte)0xB6,
+        (byte)0x8E, (byte)0x40, (byte)0x9E, (byte)0xD8,
+        (byte)0x94, (byte)0x5E, (byte)0x98, (byte)0x5F,
+        (byte)0x94, (byte)0xCE, (byte)0x92, (byte)0x4A,
+        (byte)0xFD, (byte)0x70, (byte)0x94, (byte)0x67,
+        (byte)0x8D, (byte)0xEC, (byte)0x9B, (byte)0xD8,
+        (byte)0x94, (byte)0x48, (byte)0xFA, (byte)0xC1,
+        (byte)0x9C, (byte)0xF7, (byte)0xFD, (byte)0xBE,
+        (byte)0x8F, (byte)0xDA, (byte)0xFD, (byte)0xD9,
+        (byte)0xFC, (byte)0x7E, (byte)0x93, (byte)0xF9,
+        (byte)0xFA, (byte)0x43, (byte)0xFA, (byte)0xEB,
+        (byte)0xFA, (byte)0xC3, (byte)0x97, (byte)0xD3,
+        (byte)0x95, (byte)0xF9, (byte)0x9C, (byte)0x48,
+        (byte)0xFD, (byte)0xD8, (byte)0xA0, (byte)0xD8,
+        (byte)0xFD, (byte)0xD7, (byte)0xFB, (byte)0x4A,
+        (byte)0x9B, (byte)0xAF, (byte)0x94, (byte)0x4B,
+        (byte)0xFD, (byte)0xC9, (byte)0x8E, (byte)0xAC,
+        (byte)0xFD, (byte)0xB2, (byte)0x92, (byte)0x5A,
+        (byte)0xFC, (byte)0xBD, (byte)0x92, (byte)0xD9,
+        (byte)0xFD, (byte)0xD5, (byte)0x92, (byte)0xDD,
+        (byte)0x92, (byte)0x59, (byte)0x96, (byte)0xBA,
+        (byte)0x92, (byte)0x5B, (byte)0x9B, (byte)0xAB,
+        (byte)0xFD, (byte)0xDA, (byte)0xFD, (byte)0xDE,
+        (byte)0xFD, (byte)0xD3, (byte)0x8C, (byte)0x46,
+        (byte)0xFD, (byte)0xD6, (byte)0xFD, (byte)0xDC,
+        (byte)0xFD, (byte)0xDD, (byte)0x90, (byte)0xFE,
+        (byte)0xFE, (byte)0xA1, (byte)0x8B, (byte)0xAD,
+        (byte)0x9C, (byte)0xD8, (byte)0x9E, (byte)0x6D,
+        (byte)0xFD, (byte)0x7C, (byte)0xFB, (byte)0x61,
+        (byte)0x96, (byte)0xF8, (byte)0x96, (byte)0xF0,
+        (byte)0xFC, (byte)0xF4, (byte)0xFE, (byte)0x60,
+        (byte)0x98, (byte)0x52, (byte)0x96, (byte)0x4F,
+        (byte)0x91, (byte)0x6E, (byte)0x98, (byte)0x6D,
+        (byte)0x98, (byte)0x64, (byte)0x94, (byte)0x53,
+        (byte)0xFD, (byte)0xEC, (byte)0xFB, (byte)0x78,
+        (byte)0x95, (byte)0xBA, (byte)0x98, (byte)0x5D,
+        (byte)0x92, (byte)0xF9, (byte)0x98, (byte)0x5A,
+        (byte)0xFD, (byte)0xF6, (byte)0x93, (byte)0xD0,
+        (byte)0x98, (byte)0x62, (byte)0x9B, (byte)0xAD,
+        (byte)0x97, (byte)0x4F, (byte)0x9B, (byte)0xAE,
+        (byte)0x94, (byte)0x52, (byte)0x9B, (byte)0xB0,
+        (byte)0x91, (byte)0xD2, (byte)0x97, (byte)0xEA,
+        (byte)0xFB, (byte)0x6B, (byte)0x91, (byte)0xB1,
+        (byte)0xFD, (byte)0xF3, (byte)0x92, (byte)0xCB,
+        (byte)0x9B, (byte)0xB1, (byte)0xFC, (byte)0xEC,
+        (byte)0x98, (byte)0x6B, (byte)0x97, (byte)0x51,
+        (byte)0x98, (byte)0x71, (byte)0x95, (byte)0xEF,
+        (byte)0x9E, (byte)0xF3, (byte)0x91, (byte)0xE8,
+        (byte)0x9B, (byte)0xBA, (byte)0xFB, (byte)0x4C,
+        (byte)0x92, (byte)0x6A, (byte)0xFD, (byte)0xF8,
+        (byte)0x98, (byte)0x61, (byte)0x91, (byte)0xE7,
+        (byte)0x93, (byte)0xED, (byte)0x97, (byte)0x44,
+        (byte)0x91, (byte)0xE1, (byte)0xFB, (byte)0xF5,
+        (byte)0x98, (byte)0x69, (byte)0x8A, (byte)0x62,
+        (byte)0x9B, (byte)0xBB, (byte)0x8C, (byte)0xA8,
+        (byte)0x9C, (byte)0x55, (byte)0x8E, (byte)0x77,
+        (byte)0x8A, (byte)0xB2, (byte)0x9E, (byte)0xBC,
+        (byte)0x93, (byte)0xE6, (byte)0x93, (byte)0xA2,
+        (byte)0x9B, (byte)0xBD, (byte)0x94, (byte)0xB3,
+        (byte)0x93, (byte)0x7D, (byte)0x9E, (byte)0x66,
+        (byte)0x94, (byte)0x59, (byte)0x9B, (byte)0xBF,
+        (byte)0x94, (byte)0x58, (byte)0x9E, (byte)0xA5,
+        (byte)0x9B, (byte)0xC7, (byte)0xFE, (byte)0x54,
+        (byte)0x8E, (byte)0x74, (byte)0x8B, (byte)0xD6,
+        (byte)0x94, (byte)0xB6, (byte)0xFD, (byte)0x74,
+        (byte)0x98, (byte)0xC0, (byte)0x94, (byte)0xA5,
+        (byte)0x9B, (byte)0xC8, (byte)0x95, (byte)0xED,
+        (byte)0xFD, (byte)0x7E, (byte)0xFB, (byte)0xEB,
+        (byte)0xFD, (byte)0x7D, (byte)0x97, (byte)0x6F,
+        (byte)0x94, (byte)0x61, (byte)0x9F, (byte)0xC1,
+        (byte)0x95, (byte)0xD7, (byte)0xFA, (byte)0x52,
+        (byte)0x9C, (byte)0x58, (byte)0x9F, (byte)0x68,
+        (byte)0x9B, (byte)0xE7, (byte)0xFC, (byte)0xCE,
+        (byte)0x96, (byte)0xE8, (byte)0xFA, (byte)0x49,
+        (byte)0x97, (byte)0xA1, (byte)0x95, (byte)0x4D,
+        (byte)0x9E, (byte)0xF8, (byte)0xFE, (byte)0x49,
+        (byte)0x91, (byte)0xCE, (byte)0x97, (byte)0x71,
+        (byte)0x8C, (byte)0xCF, (byte)0xFD, (byte)0xB1,
+        (byte)0xFC, (byte)0x6E, (byte)0x9C, (byte)0xF2,
+        (byte)0x93, (byte)0xB8, (byte)0x90, (byte)0x43,
+        (byte)0x97, (byte)0x59, (byte)0x94, (byte)0xD7,
+        (byte)0xFE, (byte)0x66, (byte)0x94, (byte)0x7D,
+        (byte)0xFC, (byte)0x6F, (byte)0x92, (byte)0x46,
+        (byte)0xFA, (byte)0x6D, (byte)0x8E, (byte)0xF7,
+        (byte)0xFB, (byte)0xB7, (byte)0x94, (byte)0x7C,
+        (byte)0x92, (byte)0xCD, (byte)0x97, (byte)0xB2,
+        (byte)0xFE, (byte)0x65, (byte)0x96, (byte)0x7E,
+        (byte)0x97, (byte)0x58, (byte)0x9B, (byte)0x77,
+        (byte)0x91, (byte)0xCF, (byte)0x94, (byte)0xA4,
+        (byte)0x9C, (byte)0xAD, (byte)0x8B, (byte)0xAB,
+        (byte)0x96, (byte)0xD5, (byte)0xFC, (byte)0xB3,
+        (byte)0x93, (byte)0xAE, (byte)0x97, (byte)0x6D,
+        (byte)0x94, (byte)0x46, (byte)0x95, (byte)0xF7,
+        (byte)0x9C, (byte)0x46, (byte)0x95, (byte)0x5B,
+        (byte)0x91, (byte)0xD1, (byte)0x94, (byte)0xF4,
+        (byte)0xFE, (byte)0x67, (byte)0x92, (byte)0xA5,
+        (byte)0xFE, (byte)0xDF, (byte)0x8C, (byte)0xAB,
+        (byte)0x9B, (byte)0xC9, (byte)0xFC, (byte)0xED,
+        (byte)0xFD, (byte)0xFA, (byte)0xFC, (byte)0xC8,
+        (byte)0xFE, (byte)0x62, (byte)0x91, (byte)0xFC,
+        (byte)0xFE, (byte)0x6B, (byte)0xFD, (byte)0xF9,
+        (byte)0xFC, (byte)0xC7, (byte)0x91, (byte)0x4E,
+        (byte)0x9C, (byte)0xB8, (byte)0x97, (byte)0x67,
+        (byte)0x95, (byte)0xEE, (byte)0x9B, (byte)0xB2,
+        (byte)0x94, (byte)0x60, (byte)0x94, (byte)0xA2,
+        (byte)0x98, (byte)0x75, (byte)0x97, (byte)0xAC,
+        (byte)0x91, (byte)0xD3, (byte)0x98, (byte)0x7B,
+        (byte)0x8E, (byte)0xEB, (byte)0x97, (byte)0x6A,
+        (byte)0x96, (byte)0x5E, (byte)0x97, (byte)0xEB,
+        (byte)0x9F, (byte)0xF9, (byte)0x95, (byte)0xF8,
+        (byte)0xFE, (byte)0xA2, (byte)0x8F, (byte)0xE6,
+        (byte)0xFE, (byte)0x7E, (byte)0x9D, (byte)0xA4,
+        (byte)0x97, (byte)0x68, (byte)0x8E, (byte)0xEC,
+        (byte)0x94, (byte)0xBD, (byte)0x94, (byte)0x5B,
+        (byte)0x9C, (byte)0xF6, (byte)0xFA, (byte)0xA7,
+        (byte)0x9B, (byte)0xD9, (byte)0xFA, (byte)0x5D,
+        (byte)0x96, (byte)0x56, (byte)0x97, (byte)0x62,
+        (byte)0x94, (byte)0xBA, (byte)0xA0, (byte)0x4F,
+        (byte)0x92, (byte)0xD8, (byte)0x9B, (byte)0xCB,
+        (byte)0x94, (byte)0xBB, (byte)0x9D, (byte)0x5F,
+        (byte)0x90, (byte)0xCF, (byte)0x94, (byte)0x65,
+        (byte)0x9F, (byte)0x4C, (byte)0x90, (byte)0xD8,
+        (byte)0x9E, (byte)0xBE, (byte)0xFB, (byte)0x6D,
+        (byte)0x95, (byte)0xCA, (byte)0x9D, (byte)0xC2,
+        (byte)0x97, (byte)0xF8, (byte)0x8F, (byte)0xFC,
+        (byte)0x94, (byte)0x73, (byte)0x94, (byte)0x74,
+        (byte)0xFE, (byte)0xB7, (byte)0x8A, (byte)0x4B,
+        (byte)0x8A, (byte)0x55, (byte)0x8B, (byte)0x69,
+        (byte)0x8A, (byte)0xDC, (byte)0x8B, (byte)0x76,
+        (byte)0x9B, (byte)0xCE, (byte)0x8A, (byte)0x68,
+        (byte)0xA0, (byte)0xF8, (byte)0x98, (byte)0xDF,
+        (byte)0xFE, (byte)0xB5, (byte)0x9B, (byte)0xCF,
+        (byte)0x96, (byte)0xFB, (byte)0x9B, (byte)0xFB,
+        (byte)0x9E, (byte)0xCE, (byte)0x8E, (byte)0xE5,
+        (byte)0x9E, (byte)0x7B, (byte)0x9B, (byte)0xD2,
+        (byte)0x8A, (byte)0xA5, (byte)0xFE, (byte)0xCE,
+        (byte)0x8A, (byte)0x45, (byte)0x9D, (byte)0xFC,
+        (byte)0xFE, (byte)0xCF, (byte)0x8B, (byte)0xA5,
+        (byte)0x8C, (byte)0x4A, (byte)0x8A, (byte)0xEC,
+        (byte)0xFC, (byte)0xE0, (byte)0x94, (byte)0xAD,
+        (byte)0xFE, (byte)0xD5, (byte)0x94, (byte)0xAC,
+        (byte)0xFC, (byte)0x5A, (byte)0x9B, (byte)0xD6,
+        (byte)0x8A, (byte)0x6F, (byte)0x8B, (byte)0xA9,
+        (byte)0x8E, (byte)0x5F, (byte)0x9D, (byte)0xCB,
+        (byte)0xFC, (byte)0xE7, (byte)0x9B, (byte)0xD7,
+        (byte)0x93, (byte)0xC8, (byte)0x91, (byte)0xF0,
+        (byte)0x8F, (byte)0xE0, (byte)0x9B, (byte)0xDB,
+        (byte)0x90, (byte)0xED, (byte)0x9B, (byte)0xDC,
+        (byte)0xA0, (byte)0xEC, (byte)0x98, (byte)0xFA,
+        (byte)0x9B, (byte)0xE0, (byte)0x93, (byte)0xC7,
+        (byte)0x92, (byte)0x49, (byte)0x96, (byte)0xE1,
+        (byte)0x9B, (byte)0xE2, (byte)0x9B, (byte)0xE4,
+        (byte)0x8F, (byte)0xE1, (byte)0x9B, (byte)0xE5,
+        (byte)0x94, (byte)0xC0, (byte)0x93, (byte)0xC3,
+        (byte)0x93, (byte)0xC5, (byte)0x90, (byte)0x79,
+        (byte)0x97, (byte)0x7B, (byte)0x90, (byte)0x7E,
+        (byte)0xFE, (byte)0xE6, (byte)0xFE, (byte)0x46,
+        (byte)0x9D, (byte)0xB8, (byte)0x92, (byte)0x70,
+        (byte)0x95, (byte)0xA8, (byte)0x8C, (byte)0xB0,
+        (byte)0x94, (byte)0xC8, (byte)0x98, (byte)0xB9,
+        (byte)0x91, (byte)0x40, (byte)0xFC, (byte)0xBE,
+        (byte)0x91, (byte)0x57, (byte)0x8B, (byte)0xB2,
+        (byte)0xFA, (byte)0xDF, (byte)0x9B, (byte)0xE6,
+        (byte)0x96, (byte)0x43, (byte)0x8E, (byte)0x44,
+        (byte)0x9C, (byte)0x4F, (byte)0xFE, (byte)0xF4,
+        (byte)0x9B, (byte)0xE8, (byte)0x93, (byte)0xDC,
+        (byte)0x96, (byte)0x6F, (byte)0x8E, (byte)0x4A,
+        (byte)0x9B, (byte)0xED, (byte)0x92, (byte)0xF6,
+        (byte)0x9D, (byte)0xB9, (byte)0x8E, (byte)0x4E,
+        (byte)0xFB, (byte)0xCF, (byte)0x9E, (byte)0xC2,
+        (byte)0x94, (byte)0xE5, (byte)0x9B, (byte)0xF0,
+        (byte)0x94, (byte)0xE4, (byte)0x95, (byte)0x51,
+        (byte)0x8B, (byte)0xBB, (byte)0x9B, (byte)0xF1,
+        (byte)0x94, (byte)0xF0, (byte)0x8E, (byte)0x64,
+        (byte)0x94, (byte)0xEA, (byte)0x8F, (byte)0x61,
+        (byte)0x9B, (byte)0x64, (byte)0x8E, (byte)0x5B,
+        (byte)0x9B, (byte)0xF2, (byte)0x9F, (byte)0xBE,
+        (byte)0x9D, (byte)0xC9, (byte)0x8E, (byte)0x6C,
+        (byte)0x8F, (byte)0x73, (byte)0x8C, (byte)0xAF,
+        (byte)0x8F, (byte)0x75, (byte)0x8E, (byte)0x71,
+        (byte)0x8E, (byte)0x60, (byte)0x8E, (byte)0x6A,
+        (byte)0x8C, (byte)0x4C, (byte)0x95, (byte)0x52,
+        (byte)0x95, (byte)0x54, (byte)0x8A, (byte)0xD4,
+        (byte)0x9D, (byte)0xBB, (byte)0x95, (byte)0x43,
+        (byte)0x92, (byte)0xFE, (byte)0x94, (byte)0xF2,
+        (byte)0x94, (byte)0xF1, (byte)0xA0, (byte)0xEA,
+        (byte)0x9D, (byte)0xD2, (byte)0xA0, (byte)0xB1,
+        (byte)0x91, (byte)0xF8, (byte)0x94, (byte)0x62,
+        (byte)0x9B, (byte)0xA4, (byte)0x8E, (byte)0xAD,
+        (byte)0x9E, (byte)0xAD, (byte)0x96, (byte)0xD0,
+        (byte)0xFE, (byte)0xEE, (byte)0x8A, (byte)0xB4,
+        (byte)0x97, (byte)0x57, (byte)0x8A, (byte)0x77,
+        (byte)0x9B, (byte)0xF7, (byte)0x8E, (byte)0xB5,
+        (byte)0xA0, (byte)0x6D, (byte)0x8E, (byte)0xB6,
+        (byte)0x97, (byte)0x56, (byte)0x95, (byte)0x40,
+        (byte)0xA0, (byte)0xF3, (byte)0x94, (byte)0xBE,
+        (byte)0x9B, (byte)0xFA, (byte)0xFD, (byte)0xDF,
+        (byte)0x9D, (byte)0xBC, (byte)0x94, (byte)0xFE,
+        (byte)0x8B, (byte)0xDB, (byte)0xA0, (byte)0xFE,
+        (byte)0x8E, (byte)0xC0, (byte)0x9F, (byte)0x47,
+        (byte)0x8B, (byte)0xDE, (byte)0xA0, (byte)0xFB,
+        (byte)0x8E, (byte)0xC3, (byte)0x96, (byte)0x49,
+        (byte)0xFE, (byte)0xC2, (byte)0x95, (byte)0x4C,
+        (byte)0x9B, (byte)0xFD, (byte)0x90, (byte)0xCC,
+        (byte)0x9C, (byte)0x60, (byte)0x95, (byte)0x4B,
+        (byte)0x9B, (byte)0xFE, (byte)0x9C, (byte)0x70,
+        (byte)0x9C, (byte)0x43, (byte)0x9C, (byte)0x47,
+        (byte)0x8E, (byte)0xCC, (byte)0x8E, (byte)0x54,
+        (byte)0x8E, (byte)0xE4, (byte)0x9C, (byte)0x49,
+        (byte)0x8B, (byte)0x5E, (byte)0x95, (byte)0x5E,
+        (byte)0x95, (byte)0x5C, (byte)0x9C, (byte)0x4B,
+        (byte)0x8B, (byte)0xE1, (byte)0x8E, (byte)0xD9,
+        (byte)0x9D, (byte)0xB4, (byte)0x92, (byte)0x5F,
+        (byte)0x9C, (byte)0x4C, (byte)0x8A, (byte)0xA1,
+        (byte)0x8E, (byte)0xDB, (byte)0x9C, (byte)0x56,
+        (byte)0x8A, (byte)0xA2, (byte)0x97, (byte)0x54,
+        (byte)0x9C, (byte)0x5E, (byte)0x9E, (byte)0xD4,
+        (byte)0x95, (byte)0x68, (byte)0xA0, (byte)0xC3,
+        (byte)0x8A, (byte)0xE6, (byte)0xA0, (byte)0xF7,
+        (byte)0x9C, (byte)0x61, (byte)0x9C, (byte)0x5F,
+        (byte)0xFC, (byte)0x4D, (byte)0x9E, (byte)0x5B,
+        (byte)0x9E, (byte)0x69, (byte)0x9C, (byte)0x63,
+        (byte)0xFE, (byte)0xC7, (byte)0xFE, (byte)0xC6,
+        (byte)0x9C, (byte)0x67, (byte)0x9C, (byte)0x69,
+        (byte)0x8B, (byte)0xE2, (byte)0x91, (byte)0x65,
+        (byte)0x9C, (byte)0xE7, (byte)0x8A, (byte)0x54,
+        (byte)0x9C, (byte)0x6C, (byte)0x9C, (byte)0x6E,
+        (byte)0xFE, (byte)0x5D, (byte)0x9C, (byte)0x73,
+        (byte)0x95, (byte)0x6A, (byte)0x95, (byte)0x6D,
+        (byte)0x8E, (byte)0xF0, (byte)0x8F, (byte)0x4D,
+        (byte)0x8E, (byte)0xF6, (byte)0xFA, (byte)0xBC,
+        (byte)0x8C, (byte)0xD5, (byte)0xFB, (byte)0xDA,
+        (byte)0x8B, (byte)0x4C, (byte)0xFD, (byte)0x75,
+        (byte)0x9B, (byte)0xDD, (byte)0xFA, (byte)0xF5,
+        (byte)0x9C, (byte)0x74, (byte)0x95, (byte)0x45,
+        (byte)0x96, (byte)0xC6, (byte)0x8F, (byte)0x6A,
+        (byte)0x8F, (byte)0x4E, (byte)0x9C, (byte)0x78,
+        (byte)0xFA, (byte)0x55, (byte)0x97, (byte)0xE4,
+        (byte)0x9C, (byte)0x41, (byte)0x92, (byte)0x5C,
+        (byte)0x96, (byte)0xFA, (byte)0xFB, (byte)0x66,
+        (byte)0x8E, (byte)0x65, (byte)0x98, (byte)0x49,
+        (byte)0xFB, (byte)0xA8, (byte)0x98, (byte)0x42,
+        (byte)0x9C, (byte)0x7A, (byte)0x97, (byte)0xFB,
+        (byte)0x90, (byte)0xCA, (byte)0x9C, (byte)0x5B,
+        (byte)0x97, (byte)0x4D, (byte)0x8E, (byte)0xD3,
+        (byte)0x95, (byte)0x61, (byte)0x9F, (byte)0x4B,
+        (byte)0x9F, (byte)0xB5, (byte)0x93, (byte)0xD2,
+        (byte)0xFD, (byte)0xAA, (byte)0x98, (byte)0x40,
+        (byte)0x91, (byte)0x46, (byte)0x98, (byte)0x67,
+        (byte)0xFA, (byte)0x5A, (byte)0xFB, (byte)0xA9,
+        (byte)0x98, (byte)0x41, (byte)0x8C, (byte)0xD3,
+        (byte)0xFC, (byte)0xFD, (byte)0xFD, (byte)0xAB,
+        (byte)0x91, (byte)0xBD, (byte)0x8F, (byte)0x4C,
+        (byte)0x96, (byte)0xC9, (byte)0x8F, (byte)0x55,
+        (byte)0xFB, (byte)0xAE, (byte)0x95, (byte)0x6F,
+        (byte)0x9C, (byte)0x7D, (byte)0xA0, (byte)0xF0,
+        (byte)0x94, (byte)0x6F, (byte)0xFD, (byte)0xAC,
+        (byte)0x96, (byte)0xCB, (byte)0x96, (byte)0xCE,
+        (byte)0xA0, (byte)0x56, (byte)0x9C, (byte)0xE1,
+        (byte)0x96, (byte)0xC4, (byte)0x8F, (byte)0x5E,
+        (byte)0x8F, (byte)0x6C, (byte)0x8E, (byte)0xA3,
+        (byte)0xFB, (byte)0xB3, (byte)0xFC, (byte)0x53,
+        (byte)0xFD, (byte)0xB3, (byte)0x8F, (byte)0x6B,
+        (byte)0x96, (byte)0xCA, (byte)0x8F, (byte)0x79,
+        (byte)0x9E, (byte)0x6F, (byte)0xA0, (byte)0xC5,
+        (byte)0xFC, (byte)0x78, (byte)0x8E, (byte)0x42,
+        (byte)0x8F, (byte)0x5A, (byte)0x90, (byte)0xC2,
+        (byte)0x8E, (byte)0xA5, (byte)0x90, (byte)0x61,
+        (byte)0x92, (byte)0x4F, (byte)0x93, (byte)0x73,
+        (byte)0xFD, (byte)0xB5, (byte)0xFE, (byte)0xCC,
+        (byte)0xFB, (byte)0xBD, (byte)0x8C, (byte)0xD6,
+        (byte)0x98, (byte)0x43, (byte)0x96, (byte)0xC5,
+        (byte)0x89, (byte)0xBC, (byte)0x9C, (byte)0xA3,
+        (byte)0x92, (byte)0x4B, (byte)0x98, (byte)0x4A,
+        (byte)0x8F, (byte)0xA4, (byte)0xA0, (byte)0xF1,
+        (byte)0x9E, (byte)0xFB, (byte)0x9C, (byte)0xD2,
+        (byte)0x8F, (byte)0xA7, (byte)0xFC, (byte)0x5C,
+        (byte)0x98, (byte)0x45, (byte)0x90, (byte)0x46,
+        (byte)0x8C, (byte)0xD1, (byte)0xFE, (byte)0xFA,
+        (byte)0x95, (byte)0x60, (byte)0x9F, (byte)0x48,
+        (byte)0x92, (byte)0x47, (byte)0x90, (byte)0xFB,
+        (byte)0x9C, (byte)0xA4, (byte)0x95, (byte)0x71,
+        (byte)0x9C, (byte)0xA6, (byte)0x9C, (byte)0xA7,
+        (byte)0x9C, (byte)0xAA, (byte)0x9E, (byte)0xD3,
+        (byte)0x9E, (byte)0x70, (byte)0x9C, (byte)0xAC,
+        (byte)0x8F, (byte)0xAE, (byte)0x95, (byte)0x7D,
+        (byte)0x9C, (byte)0xB0, (byte)0x97, (byte)0xB6,
+        (byte)0xA0, (byte)0xBD, (byte)0x8A, (byte)0xDF,
+        (byte)0x9E, (byte)0xAA, (byte)0x8F, (byte)0xBD,
+        (byte)0x8F, (byte)0xBF, (byte)0x93, (byte)0x69,
+        (byte)0x9B, (byte)0xA7, (byte)0xC8, (byte)0xA4,
+        (byte)0xFE, (byte)0xEA, (byte)0x9B, (byte)0xE1,
+        (byte)0x8B, (byte)0x41, (byte)0x9D, (byte)0xB6,
+        (byte)0xA0, (byte)0xEB, (byte)0x9B, (byte)0xA3,
+        (byte)0x8B, (byte)0xA1, (byte)0x8F, (byte)0xC8,
+        (byte)0x89, (byte)0x4C, (byte)0x98, (byte)0x60,
+        (byte)0x94, (byte)0xC7, (byte)0x8B, (byte)0x58,
+        (byte)0x95, (byte)0xAB, (byte)0x95, (byte)0xAA,
+        (byte)0x9C, (byte)0xC3, (byte)0x9C, (byte)0xC4,
+        (byte)0x93, (byte)0xD6, (byte)0x9D, (byte)0xAC,
+        (byte)0x8B, (byte)0xE6, (byte)0x8A, (byte)0x71,
+        (byte)0x8F, (byte)0xD1, (byte)0x99, (byte)0xD5,
+        (byte)0x90, (byte)0xF4, (byte)0x8A, (byte)0xA3,
+        (byte)0x9C, (byte)0xCE, (byte)0x9C, (byte)0xD4,
+        (byte)0x9C, (byte)0xD5, (byte)0xFB, (byte)0xC8,
+        (byte)0x9D, (byte)0xB3, (byte)0xFC, (byte)0x70,
+        (byte)0x8F, (byte)0xD7, (byte)0x9B, (byte)0x73,
+        (byte)0xFA, (byte)0x5B, (byte)0x8F, (byte)0xD2,
+        (byte)0x90, (byte)0x64, (byte)0x98, (byte)0xB6,
+        (byte)0x96, (byte)0x68, (byte)0x9C, (byte)0xD6,
+        (byte)0x98, (byte)0xBD, (byte)0x8F, (byte)0xDC,
+        (byte)0xFE, (byte)0xF6, (byte)0x8F, (byte)0xD9,
+        (byte)0x95, (byte)0x41, (byte)0x97, (byte)0xF3,
+        (byte)0x9B, (byte)0xF8, (byte)0x9E, (byte)0x6C,
+        (byte)0x8F, (byte)0xF2, (byte)0x8F, (byte)0xEE,
+        (byte)0x9C, (byte)0xD7, (byte)0x9E, (byte)0x6E,
+        (byte)0x8A, (byte)0x40, (byte)0x8F, (byte)0xEF,
+        (byte)0x8F, (byte)0xF4, (byte)0x8F, (byte)0xF5,
+        (byte)0x95, (byte)0xC2, (byte)0x98, (byte)0x6A,
+        (byte)0x97, (byte)0xCF, (byte)0x9E, (byte)0x7C,
+        (byte)0x90, (byte)0x41, (byte)0x9C, (byte)0xDB,
+        (byte)0x94, (byte)0x41, (byte)0x9C, (byte)0xE6,
+        (byte)0x9D, (byte)0xB0, (byte)0x9C, (byte)0xEA,
+        (byte)0x9C, (byte)0xED, (byte)0x9C, (byte)0xFA,
+        (byte)0x8B, (byte)0x62, (byte)0x8A, (byte)0x4E,
+        (byte)0x9C, (byte)0xCA, (byte)0x8A, (byte)0x66,
+        (byte)0x9C, (byte)0xFB, (byte)0x9C, (byte)0xFC,
+        (byte)0x9C, (byte)0xFE, (byte)0x8A, (byte)0x53,
+        (byte)0x9C, (byte)0xE5, (byte)0x9D, (byte)0x40,
+        (byte)0x9D, (byte)0x41, (byte)0x90, (byte)0x45,
+        (byte)0x8B, (byte)0x73, (byte)0x97, (byte)0xCA,
+        (byte)0x9D, (byte)0x42, (byte)0x8A, (byte)0x61,
+        (byte)0x8B, (byte)0xAE, (byte)0x8A, (byte)0xD2,
+        (byte)0x8B, (byte)0xA2, (byte)0x9D, (byte)0xF2,
+        (byte)0x9D, (byte)0x43, (byte)0x9C, (byte)0xDF,
+        (byte)0x9D, (byte)0x44, (byte)0x8E, (byte)0xCA,
+        (byte)0x90, (byte)0x4E, (byte)0x8E, (byte)0xB3,
+        (byte)0x9F, (byte)0xF5, (byte)0x9D, (byte)0x45,
+        (byte)0x90, (byte)0x4F, (byte)0x9D, (byte)0x47,
+        (byte)0x89, (byte)0xCA, (byte)0x9C, (byte)0xB5,
+        (byte)0xFB, (byte)0xFE, (byte)0x90, (byte)0x5E,
+        (byte)0x90, (byte)0x63, (byte)0x90, (byte)0x57,
+        (byte)0x90, (byte)0x66, (byte)0x9B, (byte)0xC0,
+        (byte)0xFC, (byte)0xE5, (byte)0x91, (byte)0x62,
+        (byte)0x90, (byte)0x67, (byte)0x8F, (byte)0xA1,
+        (byte)0x8F, (byte)0xA2, (byte)0x9D, (byte)0x48,
+        (byte)0xFA, (byte)0xD3, (byte)0x90, (byte)0x5D,
+        (byte)0x90, (byte)0xB9, (byte)0x90, (byte)0x6B,
+        (byte)0x8C, (byte)0x5C, (byte)0x90, (byte)0x69,
+        (byte)0xFE, (byte)0x57, (byte)0xFE, (byte)0x55,
+        (byte)0x90, (byte)0x73, (byte)0x9B, (byte)0xEF,
+        (byte)0x9C, (byte)0xF0, (byte)0x9D, (byte)0x4B,
+        (byte)0xFE, (byte)0xD9, (byte)0xFE, (byte)0xDA,
+        (byte)0x91, (byte)0xE0, (byte)0x91, (byte)0xD8,
+        (byte)0x96, (byte)0x46, (byte)0x93, (byte)0x60,
+        (byte)0xFA, (byte)0x53, (byte)0x9C, (byte)0xD3,
+        (byte)0x9D, (byte)0x4E, (byte)0xFB, (byte)0x40,
+        (byte)0x8D, (byte)0xE2, (byte)0x94, (byte)0x42,
+        (byte)0x90, (byte)0x56, (byte)0x98, (byte)0x65,
+        (byte)0x8C, (byte)0x6C, (byte)0xFA, (byte)0x4A,
+        (byte)0x9D, (byte)0x50, (byte)0x9D, (byte)0x52,
+        (byte)0x95, (byte)0xAF, (byte)0x97, (byte)0x5A,
+        (byte)0x93, (byte)0x49, (byte)0x97, (byte)0x47,
+        (byte)0xA0, (byte)0xF4, (byte)0x97, (byte)0x78,
+        (byte)0x8F, (byte)0xCF, (byte)0xFC, (byte)0x60,
+        (byte)0x8C, (byte)0x4E, (byte)0xFC, (byte)0x56,
+        (byte)0x91, (byte)0xDC, (byte)0x96, (byte)0x61,
+        (byte)0x92, (byte)0xEC, (byte)0x93, (byte)0x5D,
+        (byte)0x8E, (byte)0xDE, (byte)0x96, (byte)0xFE,
+        (byte)0xFD, (byte)0x4F, (byte)0x95, (byte)0xDE,
+        (byte)0x98, (byte)0xB0, (byte)0xA0, (byte)0x40,
+        (byte)0x97, (byte)0xBD, (byte)0x97, (byte)0x7D,
+        (byte)0x97, (byte)0xF5, (byte)0x9B, (byte)0xAC,
+        (byte)0xFA, (byte)0xDA, (byte)0x92, (byte)0xC2,
+        (byte)0x97, (byte)0xB1, (byte)0x90, (byte)0x7B,
+        (byte)0x93, (byte)0xFE, (byte)0x94, (byte)0x7B,
+        (byte)0x97, (byte)0x77, (byte)0xFA, (byte)0xBE,
+        (byte)0xFD, (byte)0x43, (byte)0x90, (byte)0xC6,
+        (byte)0x90, (byte)0xA4, (byte)0x90, (byte)0xA8,
+        (byte)0x94, (byte)0xA9, (byte)0x90, (byte)0xA9,
+        (byte)0x8C, (byte)0x65, (byte)0x95, (byte)0xE0,
+        (byte)0x90, (byte)0x7D, (byte)0x92, (byte)0x65,
+        (byte)0xFD, (byte)0xBA, (byte)0x93, (byte)0xC4,
+        (byte)0xFE, (byte)0xED, (byte)0x9D, (byte)0xAB,
+        (byte)0xA0, (byte)0xE3, (byte)0x96, (byte)0x48,
+        (byte)0x9D, (byte)0x53, (byte)0x8A, (byte)0xA9,
+        (byte)0x9B, (byte)0xC5, (byte)0x96, (byte)0x5D,
+        (byte)0x97, (byte)0x5F, (byte)0x96, (byte)0x5F,
+        (byte)0x96, (byte)0x6E, (byte)0xFB, (byte)0x5D,
+        (byte)0x9D, (byte)0xB1, (byte)0xFE, (byte)0xA3,
+        (byte)0x9D, (byte)0xB2, (byte)0x95, (byte)0xAE,
+        (byte)0xFC, (byte)0xA3, (byte)0xA0, (byte)0xA2,
+        (byte)0x96, (byte)0x55, (byte)0x9D, (byte)0x54,
+        (byte)0x93, (byte)0x41, (byte)0x95, (byte)0xAD,
+        (byte)0x91, (byte)0xD5, (byte)0x97, (byte)0x7A,
+        (byte)0xFD, (byte)0xFC, (byte)0x8E, (byte)0x47,
+        (byte)0x93, (byte)0xFD, (byte)0x90, (byte)0xA5,
+        (byte)0x90, (byte)0xAC, (byte)0x95, (byte)0xAC,
+        (byte)0x90, (byte)0xAE, (byte)0xFE, (byte)0xA5,
+        (byte)0x9D, (byte)0x56, (byte)0x97, (byte)0xE3,
+        (byte)0x95, (byte)0xE2, (byte)0x94, (byte)0x66,
+        (byte)0x96, (byte)0x47, (byte)0x91, (byte)0xB8,
+        (byte)0x9C, (byte)0xEC, (byte)0x90, (byte)0xAD,
+        (byte)0x95, (byte)0xE3, (byte)0x8B, (byte)0x4F,
+        (byte)0x8A, (byte)0xE3, (byte)0x8B, (byte)0x4D,
+        (byte)0x95, (byte)0xEA, (byte)0x8B, (byte)0x4E,
+        (byte)0x8C, (byte)0xC1, (byte)0x8B, (byte)0xED,
+        (byte)0x91, (byte)0xD9, (byte)0xA0, (byte)0xA4,
+        (byte)0x95, (byte)0xF5, (byte)0x95, (byte)0xF4,
+        (byte)0x9F, (byte)0xB3, (byte)0xFE, (byte)0xAF,
+        (byte)0xFE, (byte)0x72, (byte)0x92, (byte)0x7A,
+        (byte)0xFE, (byte)0xAC, (byte)0x95, (byte)0xF3,
+        (byte)0x9D, (byte)0x58, (byte)0x93, (byte)0x72,
+        (byte)0x91, (byte)0xC5, (byte)0x96, (byte)0x42,
+        (byte)0x90, (byte)0xCD, (byte)0x95, (byte)0xFE,
+        (byte)0x91, (byte)0x59, (byte)0x9C, (byte)0x65,
+        (byte)0x97, (byte)0xCC, (byte)0x90, (byte)0xCE,
+        (byte)0x9D, (byte)0x59, (byte)0xFC, (byte)0xF5,
+        (byte)0xFE, (byte)0xFD, (byte)0x9D, (byte)0x5B,
+        (byte)0x9D, (byte)0x5C, (byte)0x93, (byte)0x7E,
+        (byte)0x98, (byte)0xAC, (byte)0x9D, (byte)0x5E,
+        (byte)0xFD, (byte)0xD0, (byte)0xFD, (byte)0x60,
+        (byte)0x9C, (byte)0xCF, (byte)0x90, (byte)0xDD,
+        (byte)0x90, (byte)0xE0, (byte)0x90, (byte)0xF3,
+        (byte)0x98, (byte)0xB1, (byte)0x90, (byte)0xF0,
+        (byte)0x93, (byte)0xBD, (byte)0x95, (byte)0xB7,
+        (byte)0x9F, (byte)0x46, (byte)0x8E, (byte)0x4B,
+        (byte)0x96, (byte)0x58, (byte)0x8A, (byte)0x4C,
+        (byte)0x9D, (byte)0x63, (byte)0x9E, (byte)0xCF,
+        (byte)0x9D, (byte)0x65, (byte)0x9D, (byte)0x66,
+        (byte)0x96, (byte)0x5A, (byte)0x9D, (byte)0x64,
+        (byte)0x8A, (byte)0x6C, (byte)0x8A, (byte)0xD9,
+        (byte)0x9D, (byte)0x67, (byte)0x8A, (byte)0x70,
+        (byte)0x8B, (byte)0xF3, (byte)0x91, (byte)0x50,
+        (byte)0x9C, (byte)0xC1, (byte)0x9D, (byte)0x68,
+        (byte)0x93, (byte)0xA7, (byte)0x96, (byte)0x74,
+        (byte)0xA0, (byte)0xEF, (byte)0x91, (byte)0x51,
+        (byte)0x96, (byte)0xC1, (byte)0x8C, (byte)0x64,
+        (byte)0x96, (byte)0x76, (byte)0x9D, (byte)0x69,
+        (byte)0xFC, (byte)0xA4, (byte)0x9D, (byte)0x6A,
+        (byte)0x92, (byte)0x4E, (byte)0x9D, (byte)0x6B,
+        (byte)0x9B, (byte)0xC1, (byte)0x9D, (byte)0x6C,
+        (byte)0x8A, (byte)0x65, (byte)0x91, (byte)0x5D,
+        (byte)0x9D, (byte)0x6D, (byte)0x91, (byte)0x5A,
+        (byte)0x8C, (byte)0x42, (byte)0x9C, (byte)0xC0,
+        (byte)0x91, (byte)0x6A, (byte)0x9D, (byte)0x6E,
+        (byte)0x9E, (byte)0xA6, (byte)0x9D, (byte)0xCD,
+        (byte)0x9D, (byte)0x6F, (byte)0x89, (byte)0xBB,
+        (byte)0x9E, (byte)0xF9, (byte)0x96, (byte)0xB4,
+        (byte)0x91, (byte)0x72, (byte)0x9E, (byte)0xC8,
+        (byte)0x8B, (byte)0x55, (byte)0x9D, (byte)0x71,
+        (byte)0x9D, (byte)0x72, (byte)0x9E, (byte)0xCC,
+        (byte)0x91, (byte)0x74, (byte)0x9E, (byte)0xD0,
+        (byte)0x90, (byte)0x5C, (byte)0x8E, (byte)0xD2,
+        (byte)0x91, (byte)0xA8, (byte)0x91, (byte)0x77,
+        (byte)0x96, (byte)0xBF, (byte)0x96, (byte)0xC0,
+        (byte)0x8F, (byte)0xB1, (byte)0x96, (byte)0xB7,
+        (byte)0x8C, (byte)0x55, (byte)0x91, (byte)0x78,
+        (byte)0x89, (byte)0xBE, (byte)0x91, (byte)0x7C,
+        (byte)0xFB, (byte)0x77, (byte)0x91, (byte)0x75,
+        (byte)0x91, (byte)0xA3, (byte)0x91, (byte)0x76,
+        (byte)0x96, (byte)0xBE, (byte)0x91, (byte)0x79,
+        (byte)0x96, (byte)0xB6, (byte)0x91, (byte)0xA4,
+        (byte)0x91, (byte)0xA6, (byte)0x9D, (byte)0x75,
+        (byte)0x90, (byte)0x52, (byte)0xA0, (byte)0x45,
+        (byte)0x91, (byte)0xA9, (byte)0x98, (byte)0xAA,
+        (byte)0x8C, (byte)0x5F, (byte)0x8B, (byte)0xAA,
+        (byte)0x9C, (byte)0xDD, (byte)0x9D, (byte)0x77,
+        (byte)0x89, (byte)0x40, (byte)0x9E, (byte)0xEC,
+        (byte)0x93, (byte)0xAA, (byte)0x94, (byte)0x78,
+        (byte)0x9D, (byte)0x7A, (byte)0x8A, (byte)0xC9,
+        (byte)0x8B, (byte)0x4B, (byte)0x9F, (byte)0xEC,
+        (byte)0x8A, (byte)0xE2, (byte)0x9E, (byte)0x75,
+        (byte)0x98, (byte)0x74, (byte)0x9A, (byte)0xC8,
+        (byte)0xA0, (byte)0x47, (byte)0x8B, (byte)0xC3,
+        (byte)0xFC, (byte)0x48, (byte)0xFC, (byte)0x77,
+        (byte)0x9C, (byte)0x52, (byte)0x8E, (byte)0xFD,
+        (byte)0x8F, (byte)0xA8, (byte)0x95, (byte)0x7A,
+        (byte)0x8F, (byte)0xF0 };
+
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing the 1651 surrogate
+     * pairs equivalent to 1651 supplementary characters whose
+     * mappings are covered by HKSCS (2001)
+     */
+
+    public static void main(String[] args) throws Exception {
+        char[] surrogatePair = new char[2];
+
+        for (int i=0, j=0 ; j < expectBytes.length ; i++, j+=2) {
+            surrogatePair[0] = (char) ((suppValues[i] - 0x10000) / 0x400 + 0xd800);
+            surrogatePair[1] = (char) ((suppValues[i] - 0x10000) % 0x400 + 0xdc00);
+            String testStr = new String(surrogatePair);
+            byte[] encodedBytes = testStr.getBytes("Big5-HKSCS");
+
+            if (encodedBytes[0] != expectBytes[j]
+                && encodedBytes[1] != expectBytes[j+1])
+                    throw new Exception("HKSCS Surrogate Encoder error");
+
+            String decoded = new String(encodedBytes, "Big5-HKSCS");
+
+            if (!decoded.equals(testStr)) {
+                throw new Exception("HKSCS Decoder error");
+            }
+        }
+     }
+}
diff --git a/jdk/test/sun/nio/cs/Test4200310.sh b/jdk/test/sun/nio/cs/Test4200310.sh
new file mode 100644
index 0000000..cc38a66
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Test4200310.sh
@@ -0,0 +1,41 @@
+#
+# Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+# 
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+# 
+# This code 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
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+# 
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+# 
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test
+# @bug 4200310
+# @summary make sure class files are not duplicated between rt.jar,
+# charsets.jar, and localedata.jar
+# @author Norbert Lindenberg
+# @run shell Test4200310.sh
+
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/rt.jar" > class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/charsets.jar" >> class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/ext/localedata.jar" >> class-list
+duplicates=`grep '\.class$' class-list | sort | uniq -d`
+
+rm -f class-list
+if [ "$duplicates" != "" ]; then
+   echo FAILED: $duplicates are duplicated between rt.jar, charsets.jar, and localedata.jar
+   exit 1
+fi
+
+exit 0
diff --git a/jdk/test/sun/nio/cs/Test4206507.java b/jdk/test/sun/nio/cs/Test4206507.java
new file mode 100644
index 0000000..15097d7
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Test4206507.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4206507
+   @summary verify that we can obtain and use a converter for encoding
+    ISO8859-9 in the Turkish locale.
+ */
+
+import java.util.Locale;
+import java.io.UnsupportedEncodingException;
+
+public class Test4206507 {
+    public static void main(String[] args) throws UnsupportedEncodingException {
+        Locale.setDefault(new Locale("tr", "TR"));
+        byte[] b = "".getBytes("ISO8859-9");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/Test6254467.java b/jdk/test/sun/nio/cs/Test6254467.java
new file mode 100644
index 0000000..bc50857
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Test6254467.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6254467
+   @summary Checks if Charset.forName() accepts legal IANA alias names
+            for charset IBM037.
+ */
+import java.nio.charset.Charset;
+
+public class Test6254467 {
+    public static void main (String[] args) throws Exception {
+            Charset ebcdic = Charset.forName("ebcdic-cp-us");
+            ebcdic = Charset.forName("ebcdic-cp-ca");
+            ebcdic = Charset.forName("ebcdic-cp-wt");
+            ebcdic = Charset.forName("ebcdic-cp-nl");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/Test6275027.java b/jdk/test/sun/nio/cs/Test6275027.java
new file mode 100644
index 0000000..2658b3d
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Test6275027.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6275027
+   @summary Check if StreamEncoder works correctly when fed with unpaired
+            surrogates.
+ */
+
+import java.io.*;
+public class Test6275027 {
+    public static void main( String arg[] ) throws Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream ps = new PrintStream(baos);
+        ps.print("\uda00");
+        ps.print("\uda01");
+        ps.close();
+        if (!"??".equals(baos.toString()))
+            throw new Exception("failed");
+    }
+
+}
diff --git a/jdk/test/sun/nio/cs/Test6392804.java b/jdk/test/sun/nio/cs/Test6392804.java
new file mode 100644
index 0000000..d93343a
--- /dev/null
+++ b/jdk/test/sun/nio/cs/Test6392804.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+   @bug 6392804
+   @summary Decoder fails to detect decoding error
+*/
+import java.nio.*;
+import java.nio.charset.*;
+
+public class Test6392804 {
+    public static void main(String[] args) throws Throwable {
+        test("ISO-2022-JP",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("ISO-2022-JP-2",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-50220",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-50221",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-iso2022jp",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0xa8, (byte)0xad, (byte)0xe5});
+        //out of range second  byte
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0x92, (byte)0xa1, (byte)0xa1});
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0x98, (byte)0xa1, (byte)0xa1});
+    }
+
+    static void test(String csn, byte[] bytes) throws Throwable {
+        CharsetDecoder dec = Charset.forName(csn).newDecoder();
+        CharBuffer cb = CharBuffer.allocate(1024);
+        CoderResult cr = dec.decode(ByteBuffer.wrap(bytes), cb, true);
+        if (cr.isUnderflow())
+            throw new RuntimeException(csn + " failed cr=" + cr);
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestCompoundTest.java b/jdk/test/sun/nio/cs/TestCompoundTest.java
new file mode 100644
index 0000000..a75f356
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestCompoundTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6427981
+ * @summary Check the Compound_Text's canonical name and its aliases
+ */
+
+import java.nio.charset.*;
+import java.util.Set;
+
+public class TestCompoundTest {
+
+    public static void main(String args[]) throws Exception
+    {
+        if (System.getProperty("os.name").startsWith("Windows"))
+            return;
+        Charset cs = Charset.forName("COMPOUND_TEXT");
+        if (!cs.name().startsWith("x-"))
+            throw new RuntimeException("FAILED: name does not start with x-");
+        Set<String> aliases = cs.aliases();
+        if (!aliases.contains("COMPOUND_TEXT") ||
+            !aliases.contains("x-compound-text") ||
+            !aliases.contains("x11-compound_text"))
+            throw new RuntimeException("FAILED: alias name is missing");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java
new file mode 100644
index 0000000..985ca61
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4122961
+   @summary Verify that converters don't drop characters on buffer boundaries
+
+   This is a slightly modified version of the attachment supplied with the
+   bug report.
+ */
+import java.io.*;
+
+public class TestConverterDroppedCharacters {
+    public static void main(String args[])
+        throws java.io.IOException, java.io.UnsupportedEncodingException,
+               java.io.FileNotFoundException
+    {
+        /* Try misc. encodings, many are broken. */
+        tryEncoding("Big5");
+        tryEncoding("CNS11643");
+        tryEncoding("Cp1006");
+        tryEncoding("Cp1381");
+        tryEncoding("Cp33722");
+        tryEncoding("GB2312");
+        tryEncoding("KSC5601");
+        tryEncoding("SJIS");
+        tryEncoding("UTF8");
+    }
+
+    static void tryEncoding(String encoding)
+        throws java.io.IOException, java.io.UnsupportedEncodingException,
+               java.io.FileNotFoundException
+    {
+        String filename = "OUTPUT";
+        int goesBadAfter = 8193;
+        int i;
+        char data[] = new char[goesBadAfter+1];
+
+        System.out.println("Testing " + encoding);
+
+        /* Create some data */
+        for(i = 0; i < goesBadAfter; i++) {
+            data[i] = (char)((i % 0x7f) + 1);
+        }
+
+        /* Write the data out to a file. */
+        FileOutputStream fout = new FileOutputStream(filename);
+        OutputStreamWriter ow = new OutputStreamWriter(fout, encoding);
+        BufferedWriter fd     = new BufferedWriter(ow);
+        fd.write(data,0,goesBadAfter);
+        fd.close();
+
+        /* Now read it back with the same encoding. */
+        char buf[] = new char[goesBadAfter+1];
+        FileInputStream fin = new FileInputStream("OUTPUT");
+        InputStreamReader ir = new InputStreamReader(fin, encoding);
+        ir.read(buf,0,goesBadAfter);
+        ir.close();
+
+        /* And check to see if what we wrote is what we got back. */
+        for(i = 0; i < goesBadAfter; i++) {
+            if (data[i] != buf[i]) {
+                System.out.println("ERROR with encoding " + encoding
+                                   + ": Data wrong at position " + i + "   "
+                                   + "in: " + (int)data[i] + "   "
+                                   + "out: " + (int)buf[i]);
+                throw new RuntimeException();
+            }
+        }
+        System.out.println("Successfully tested " + encoding);
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestCp834_SBCS.java b/jdk/test/sun/nio/cs/TestCp834_SBCS.java
new file mode 100644
index 0000000..06c939d
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestCp834_SBCS.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6379808
+   @summary Check all Cp933 SBCS characters are not supported in Cp834
+ */
+
+import sun.io.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestCp834_SBCS {
+    public static void main(String args[]) throws Exception {
+        // The correctness of 1:1 mapping is Coverted by CoderTest.java
+        // and TestConv.java, we only need to verify that SBCS characters
+        // are not supported by this charset.
+        CharToByteConverter cb834 = CharToByteConverter.getConverter("Cp834");
+        ByteToCharConverter bc834 = ByteToCharConverter.getConverter("Cp834");
+        CharsetEncoder enc834 = Charset.forName("Cp834")
+                                       .newEncoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+
+        CharsetDecoder dec834 = Charset.forName("Cp834")
+                                       .newDecoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+
+        CharsetDecoder dec933 = Charset.forName("Cp933")
+                                       .newDecoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+        byte[] ba = new byte[1];
+        byte[] ba2 = new byte[2];
+        ByteBuffer dbb = ByteBuffer.allocateDirect(10);
+        char[] ca = new char[1];
+        char c;
+        for (int i = 0; i <= 0xff; i++) {
+            if (i != 0xe && i != 0xf) {   // no SI/SO
+                ba[0] = (byte)i;
+                CharBuffer cb = dec933.decode(ByteBuffer.wrap(ba));
+                if ((c = cb.get()) != '\ufffd') {
+                    // OK, this is a SBCS character in Cp933
+                    if (dec834.decode(ByteBuffer.wrap(ba)).get() != '\ufffd')
+                        throw new Exception("SBCS is supported in IBM834 decoder");
+
+                    if (enc834.canEncode(c))
+                        throw new Exception("SBCS can be encoded in IBM834 encoder");
+
+                    ca[0] = c;
+                    ByteBuffer bb = enc834.encode(CharBuffer.wrap(ca));
+                    if (bb.get() != (byte)0xfe || bb.get() != (byte)0xfe)
+                        throw new Exception("SBCS is supported in IBM834 encoder");
+
+                    boolean isMalformed = false;
+                    int ret = 0;
+                    bc834.reset();
+                    try {
+                        ret = bc834.convert(ba, 0, 1, ca, 0, 1);
+                    } catch (sun.io.MalformedInputException x) { isMalformed = true; }
+                    if (!isMalformed && ret != 0 && ca[0] != '\ufffd') {
+                        // three scenarios (1)malformed (2)held as an incomplete
+                        // input or (3)return replacement all mean "no sbcs"
+                        throw new Exception("SBCS is supported in Cp834 b2c");
+                    }
+
+                    if (cb834.canConvert(c))
+                        throw new Exception("SBCS can be converted in Cp834 c2b ");
+
+                    ca[0] = c;
+                    if (cb834.convert(ca, 0, 1, ba2, 0, 2) != 2 ||
+                        ba2[0] != (byte)0xfe || ba2[1] != (byte)0xfe) {
+                        throw new Exception("SBCS is supported in Cp834 c2b");
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestCp93xSISO.java b/jdk/test/sun/nio/cs/TestCp93xSISO.java
new file mode 100644
index 0000000..4a9de28
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestCp93xSISO.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4429358
+   @summary Remove illegal SI/SO char to byte mappings
+ */
+
+public class TestCp93xSISO {
+    public static void main ( String[] args) throws Exception {
+        int exceptionCount = 0;
+        String[] encName = {"Cp930", "Cp933", "Cp935", "Cp937", "Cp939" };
+
+        String s = "\u000e\u000f" ;
+
+        for ( int i=0; i < encName.length; i++) { // Test 2 converters.
+            try {
+                byte[] encoded = s.getBytes(encName[i]);
+                for (int j=0 ; j<encoded.length; j++) {
+                    if (encoded[j] != (byte)0x6f) // Expect to map to 0x6f
+                        exceptionCount++;
+                }
+            } catch (Throwable t) {
+                    System.err.println("error with converter " + encName[i]);
+                    exceptionCount++;
+            }
+        }
+
+        if (exceptionCount > 0)
+           throw new Exception ("bug4429369: Cp93x SI/SO Ch->Byte mappings incorrect");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestIBMBugs.java b/jdk/test/sun/nio/cs/TestIBMBugs.java
new file mode 100644
index 0000000..dcca1ed
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestIBMBugs.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6371437 6371422 6371416 6371619 5058184 6371431
+   @summary Check if the problems reported in above bugs have been fixed
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestIBMBugs {
+
+    private static void bug6371437() throws Exception {
+        CharsetEncoder converter = Charset.forName("Cp933").newEncoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        CharBuffer in = CharBuffer.wrap(new char[] { (char)4352 });
+        try {
+              ByteBuffer out = converter.encode(in);
+        } catch (CharacterCodingException e) { }
+    }
+
+    private static void bug6371422() throws Exception {
+        String[] charsets = { "Cp949", "Cp949C" };
+        for (int n = 0; n < charsets.length; n++) {
+            String charset = charsets[n];
+            CharsetEncoder converter = Charset.forName(charset).newEncoder();
+            converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+            converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+            int errors = 0;
+            for (int i = 1; i < 0x1ffff; i++) {
+                if (i >= 0x1100 && i <= 0x11f9)
+                    continue;  //Dont try leading consonant, vowel and trailing
+                               //consonant as a single char
+                char[] in = (i < 0x10000
+                         ? new char[] { (char)i }
+                             : new char[] { (char)(0xd800 + ((i - 0x10000) >> 10)),
+                              (char)(0xdc00 + ((i - 0x10000) & 0x3ff)) });
+
+                try {
+                    ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+                    if (out.remaining() == 0 ||
+                        (out.remaining() == 1 && out.get(0) == 0x00)) {
+                    errors++;
+                    }
+                } catch (CharacterCodingException e) { }
+            }
+            if (errors > 0)
+                throw new Exception("Charset "+charset+": "+errors+" errors");
+        }
+    }
+
+    private static void bug6371416() throws Exception {
+        String[] charsets = { "Cp933", "Cp949", "Cp949C", "Cp970"};
+        for (int n = 0; n < charsets.length; n++) {
+            String charset = charsets[n];
+            CharsetEncoder converter = Charset.forName(charset).newEncoder();
+            converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+            converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+            int errors = 0;
+            for (int i = 0xd800; i < 0xe000; i++) {
+                char[] in = new char[] { (char)i };
+                try {
+                    ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+                    if (out.remaining() == 0)
+                        errors++;
+                } catch (CharacterCodingException e) { }
+            }
+            if (errors > 0)
+                throw new Exception("Charset "+charset+": "+errors+" errors");
+        }
+    }
+
+    private static void bug6371619() throws Exception {
+        String encoding = "Cp964";
+        Charset charset = Charset.forName(encoding);
+        CharsetDecoder converter = charset.newDecoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        int errors = 0;
+        for (int b = 0x80; b < 0x100; b++)
+            if (!(b == 0x8e ||  // 0x8e is a SS2
+                  (b >= 0x80 && b <= 0x8d) || (b >= 0x90 && b <= 0x9f))) {
+                ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+                try {
+                    CharBuffer out = converter.decode(in);
+                    if (out.length() == 0) {
+                        errors++;
+                    }
+                } catch (CharacterCodingException e) { }
+            }
+        if (errors > 0)
+            throw new Exception("Charset "+charset+": "+errors+" errors");
+    }
+
+
+    private static void bug6371431() throws Exception {
+        String encoding = "Cp33722";
+        Charset charset = Charset.forName(encoding);
+        CharsetDecoder converter = charset.newDecoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        int errors = 0;
+        for (int b = 0xa0; b < 0x100; b++) {
+            ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+            try {
+                CharBuffer out = converter.decode(in);
+                if (out.length() == 0) {
+                    errors++;
+                }
+            } catch (CharacterCodingException e) { }
+        }
+        if (errors > 0)
+            throw new Exception("Charset "+charset+": "+errors+" errors");
+    }
+
+    public static void main (String[] args) throws Exception {
+        bug6371437();
+        bug6371422();
+        bug6371416();
+        bug6371619();
+        bug6371431();
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestISCII91.java b/jdk/test/sun/nio/cs/TestISCII91.java
new file mode 100644
index 0000000..01b05ba
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestISCII91.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6431650
+   @summary Check charset ISCII91 and C2B/B2CISCII91 yield same encoding/decoding result
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+import sun.io.*;
+
+public class TestISCII91 {
+    public static void main(String[] args) throws Throwable{
+        CharToByteConverter c2b = new CharToByteISCII91();
+        ByteToCharConverter b2c = new ByteToCharISCII91();
+        Charset cs = Charset.forName("ISCII91");
+        String charsToEncode = getCharsForEncoding("ISCII91");
+
+        byte [] c2bBytes = c2b.convertAll(charsToEncode.toCharArray());
+        byte [] csBytes = cs.encode(charsToEncode).array();
+        for (int i = 0; i < c2bBytes.length; ++i) {
+            if (c2bBytes[i] != csBytes[i])
+                throw new RuntimeException("ISCII91 encoding failed!");
+        }
+
+        char[] c2bChars = b2c.convertAll(c2bBytes);
+        char[] csChars = cs.decode(ByteBuffer.wrap(csBytes)).array();
+        for (int i = 0; i < c2bChars.length; ++i) {
+            if (c2bChars[i] != csChars[i])
+                throw new RuntimeException("ISCII91 decoding failed!");
+        }
+    }
+
+
+    static String getCharsForEncoding(String encodingName)
+        throws CharacterCodingException{
+        Charset set = Charset.forName(encodingName);
+        CharBuffer chars = CharBuffer.allocate(300);
+        CharsetEncoder encoder = set.newEncoder();
+        for (int c = 0; chars.remaining() > 0 && c < Character.MAX_VALUE; ++c) {
+            if (Character.isDefined((char) c) && !Character.isISOControl((char) c) && encoder.canEncode((char) c)) {
+                chars.put((char) c);
+            }
+        }
+        chars.limit(chars.position());
+        chars.rewind();
+        return chars.toString();
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java
new file mode 100644
index 0000000..f27ba85
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4779029 4924625 6392664
+   @summary Test decoding of various permutations of valid ISO-2022-CN byte sequences
+ */
+
+/*
+ * Regression test for NIO ISO-2022-CN decoder. Passes various valid
+ * ISO-2022-CN byte sequences to the decoder using the java.io
+ * InputStreamReader API
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022CNDecoder
+{
+    private static String encodingName = "ISO2022CN";
+
+    //
+    // Positive tests -- test both output and input processing against
+    // various "known good" data
+    //
+    private static boolean decodeTest (
+        byte encoded[],
+        char decoded[],
+        String label)
+    {
+        boolean retval = true;
+        int i = 0;
+
+        try {
+            //
+            // Ensure that reading decodes correctly
+            //
+            ByteArrayInputStream in;
+            InputStreamReader reader;
+
+            in = new ByteArrayInputStream(encoded);
+            reader = new InputStreamReader(in, encodingName);
+
+            for (i = 0; i < decoded.length; i++) {
+                int c = reader.read();
+
+                if (c != decoded[i]) {
+                    System.err.print(label + ": read failed, char " + i);
+                    System.err.print(" ... expected 0x"
+                            + Integer.toHexString(decoded[i]));
+                    if (c == -1)
+                        System.err.println(", got EOF");
+                    else
+                        System.err.println(", got 0x"
+                            + Integer.toHexString(c));
+                    retval = false;
+                    if (c == -1)
+                        return retval;
+                }
+            }
+
+            int testChar;
+            if ((testChar = reader.read()) != -1) {
+                System.err.println(label + ": read failed, no EOF");
+                System.err.println("testChar is " +
+                        Integer.toHexString((int)testChar));
+                return false;
+            }
+            String decodedString = new String(encoded, "ISO2022CN");
+
+            for (i = 0; i < decodedString.length(); i++) {
+                if (decodedString.charAt(i) != decoded[i])
+                    System.err.println(label + ": read failed, char " + i);
+            }
+
+            CharsetDecoder dec = Charset.forName("ISO2022CN")
+                .newDecoder()
+                .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                .onMalformedInput(CodingErrorAction.REPLACE);
+            ByteBuffer bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+            bb.flip();
+            CharBuffer cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+                                      .asCharBuffer();
+            if (bb.hasArray() || cb.hasArray()) {
+                System.err.println(label + ": directBuffer failed, ");
+                return false;
+            }
+            if (!dec.decode(bb, cb, true).isUnderflow()) {
+                System.err.println(label + ": decoder's decode() failed!");
+                return false;
+            }
+            cb.flip();
+            for (i = 0; i < cb.limit(); i++) {
+                if (cb.get() != decoded[i])
+                    System.err.println(label + ": decoder failed, char " + i);
+            }
+
+        } catch (Exception e) {
+            System.err.println(label + ": failed "
+                + "(i = " + i + "), "
+                + e.getClass().getName()
+                + ", " + e.getMessage());
+            e.printStackTrace();
+            return false;
+        }
+        return retval;
+    }
+
+    private static boolean equal(CoderResult a, CoderResult b) {
+        return (a == CoderResult.OVERFLOW && b == CoderResult.OVERFLOW) ||
+            (a == CoderResult.UNDERFLOW && b == CoderResult.UNDERFLOW) ||
+            ((a.isError() == b.isError()) &&
+             (a.isMalformed() == b.isMalformed()) &&
+             (a.isUnmappable() == b.isUnmappable()) &&
+             (a.length() == b.length()));
+    }
+
+    private static boolean decodeResultTest (byte encoded[],
+                                             CoderResult expected,
+                                             String label) {
+        CharsetDecoder dec = Charset.forName("ISO2022CN").newDecoder();
+        ByteBuffer bb = ByteBuffer.wrap(encoded);
+        CharBuffer cb = CharBuffer.allocate(encoded.length*(int)dec.maxCharsPerByte());
+        CoderResult result = dec.decode(bb, cb, true);
+        if (!equal(result, expected)) {
+            System.err.println(label + ": decoder's decode() failed!");
+            return false;
+        }
+
+        bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+        bb.flip();
+        cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+            .asCharBuffer();
+        if (bb.hasArray() || cb.hasArray()) {
+            System.err.println(label + ": directBuffer failed, ");
+            return false;
+        }
+        result = dec.reset().decode(bb, cb, true);
+        if (!equal(result, expected)) {
+            System.err.println(label + ": decoder's decode() - direct failed!");
+            return false;
+        }
+        return true;
+    }
+
+    //
+    // Negative tests -- only for input processing, make sure that
+    // invalid or corrupt characters are rejected.
+    //
+    private static boolean negative (byte encoded [], String label)
+    {
+        try {
+            ByteArrayInputStream in;
+            InputStreamReader reader;
+            int c;
+
+            in = new ByteArrayInputStream(encoded);
+            reader = new InputStreamReader(in, encodingName);
+
+            c = reader.read();
+            System.err.print (label + ": read failed, ");
+
+            if (c == -1)
+                System.err.println("reported EOF");
+            else
+                System.err.println("returned char 0x"
+                    + Integer.toHexString(c)
+                    + ", expected exception");
+            return false;
+
+        } catch (CharConversionException e) {
+            return true;
+
+        } catch (Throwable t) {
+            System.err.println(label + ": failed, threw "
+                + t.getClass().getName()
+                + ", " + t.getMessage());
+        }
+        return false;
+    }
+
+    private static boolean decodeTest6392664 () {
+        try {
+            CharsetDecoder dec = Charset.forName("ISO-2022-CN-GB").newDecoder();
+            dec.decode(ByteBuffer.wrap(new byte[] {(byte)0x0e, (byte)0x42, (byte)0x43 }));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    //
+    // TEST #0: 7-bit unshifted values,
+    // shift-in of a valid decodable GB2312-80
+    // character and an unmappable GB2312-80 char
+    // This is a positive test.
+    //
+    private static byte test0_bytes[] = {
+        (byte)0x00,
+        (byte)0x01, (byte)0x02, (byte)0x03,
+        (byte)0x0E, (byte)0x21, (byte)0x2f,
+        (byte)0x0E, (byte)0xDD, (byte)0x9f
+    };
+
+    private static char test0_chars[] = {
+        0x0000,
+        0x0001, 0x0002, 0x0003,
+        0x2019,
+        0xFFFD
+    };
+
+    private static byte test1_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, (byte)0x21,
+        (byte)0x2f };
+
+    private static char test1_chars[] = {
+        0x21, 0x2f
+    };
+
+    private static byte test2_bytes[] = {
+        (byte)0x0e,
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test2_chars[] = {
+        0x2019
+    };
+
+    private static byte test3_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e,
+        (byte)0x21, (byte)0x2f };
+
+    private static byte test3a_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x41,
+        (byte)0x0e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test3_chars[] = {
+        0x2019
+    };
+
+    private static byte test4_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0f,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test4_chars[] = {
+        0x21, 0x2f
+    };
+
+    private static byte test5_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+    private static char test5_chars[] = {
+        0x2018, 0x21, 0x2f
+    };
+
+    private static byte test6_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test6_chars[] = {
+        0x2018, 0x2019
+    };
+
+    private static byte test7_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test7_chars[] = {
+        0xFE50, 0xFE51
+    };
+
+    private static byte test8_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+    private static char test8_chars[] = {
+        0xFE50, 0x21, 0x2f
+    };
+
+    private static byte test9_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H',
+        (byte)0x1b, (byte)0x4e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test9_chars[] = {
+        0x4e0e
+    };
+
+    /*
+     * Plane 3 support provided for compatibility with
+     * sun.io ISO2022_CN decoder. Officially ISO-2022-CN
+     * just handles planes 1/2 of CNS-11643 (1986)
+     * Test case data below verifies this compatibility
+     *
+     */
+
+    private static byte test10_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I',
+        (byte)0x1b, (byte)0x4f,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test10_chars[] = {
+        0x51e2
+    };
+
+    private static byte test11_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+        (byte)0x0e,                                     //SO
+        (byte)0x21, (byte)0x2e,                         //GB2312 char
+        (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H',  //SS2 Designator
+        (byte)0x1b, (byte)0x4e,                         //SS2
+        (byte)0x21, (byte)0x2f,                         //CNS-P2 char
+        (byte)0x21, (byte)0x2f                          //GB2312 char
+    };
+
+    private static char test11_chars[] = {
+        0x2018,
+        0x4e0e,
+        0x2019
+    };
+
+    private static byte test12_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+        (byte)0x0e,                                     //SO
+        (byte)0x21, (byte)0x2e,                         //GB2312 char
+        (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I',  //SS3 Designator
+        (byte)0x1b, (byte)0x4f,                         //SS3
+        (byte)0x21, (byte)0x2f,                         //CNS-P2 char
+        (byte)0x21, (byte)0x2f                          //GB2312 char
+    };
+
+    private static char test12_chars[] = {
+        0x2018,
+        0x51e2,
+        0x2019
+    };
+
+
+    private static byte test13_bytes[] = {
+        (byte)0x0f0,   // byte with MSB
+    };
+
+    private static char test13_chars[] = {
+        0x00f0,
+    };
+
+    private static byte test14_bytes[] = {
+        (byte)0x0E, (byte)0x21, (byte)0x2f,
+        (byte)0x0E, (byte)0xDD, (byte)0x9f
+    };
+    private static CoderResult test14_result = CoderResult.unmappableForLength(2);
+
+    // Current ISO2022CN treats the "out of range" code points as "unmappable"
+    private static byte test15_bytes[] = {
+        (byte)0x1b, (byte)0x4f,      // SS3
+        (byte)0x20, (byte)0x2f,      // "out of range" CNS-P2 char
+    };
+    private static  CoderResult test15_result = CoderResult.unmappableForLength(4);
+
+    /**
+     * Main program to test ISO2022CN conformance
+     *
+     */
+    public static void main (String argv []) throws Exception
+    {
+        boolean pass = true;
+
+        System.out.println ("");
+        System.out.println ("------ checking ISO2022CN decoder -----");
+
+        // This regtest must be the first one.
+        pass &= decodeTest6392664();
+
+        try {
+            new InputStreamReader (System.in, "ISO2022CN");
+        } catch (Exception e) {
+            encodingName = "ISO2022CN";
+            System.out.println ("... requires nonstandard encoding name "
+                    + encodingName);
+            pass &= false;
+        }
+
+        //
+        // Positive tests -- good data is dealt with correctly
+        //
+        pass &= decodeTest(test0_bytes, test0_chars, "first batch");
+        pass &= decodeTest(test1_bytes, test1_chars, "escapes1");
+        pass &= decodeTest(test2_bytes, test2_chars, "escapes2");
+        pass &= decodeTest(test3_bytes, test3_chars, "escapes3");
+        pass &= decodeTest(test3a_bytes, test3_chars, "escapes3a");
+        pass &= decodeTest(test4_bytes, test4_chars, "escapes4");
+        pass &= decodeTest(test5_bytes, test5_chars, "escapes5");
+        pass &= decodeTest(test6_bytes, test6_chars, "escapes6");
+        pass &= decodeTest(test7_bytes, test7_chars, "escapes7");
+        pass &= decodeTest(test8_bytes, test8_chars, "escapes8");
+        pass &= decodeTest(test9_bytes, test9_chars, "escapes9");
+        pass &= decodeTest(test10_bytes, test10_chars, "escapes10");
+        pass &= decodeTest(test11_bytes, test11_chars, "escapes11");
+        pass &= decodeTest(test12_bytes, test12_chars, "escapes12");
+        pass &= decodeTest(test13_bytes, test13_chars, "escapes13");
+        pass &= decodeResultTest(test14_bytes, test14_result, "escapes14");
+        pass &= decodeResultTest(test15_bytes, test15_result, "escapes15");
+        // PASS/FAIL status is what the whole thing is about.
+        //
+        if (! pass) {
+            throw new Exception("FAIL -- incorrect ISO-2022-CN");
+        }
+
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestISO2022JP.java b/jdk/test/sun/nio/cs/TestISO2022JP.java
new file mode 100644
index 0000000..a2f2b33
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestISO2022JP.java
@@ -0,0 +1,612 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4626545 4879522 4913711 4119445
+   @summary Check full coverage encode/decode for ISO-2022-JP
+ */
+
+/*
+ * Tests the NIO converter for J2RE >= 1.4.1
+ * since the default converter used by String
+ * API is the NIO converter sun.nio.cs.ext.ISO2022_JP
+ */
+
+import java.io.*;
+public class TestISO2022JP {
+
+    private final static String US_ASCII =
+        "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+        "\b\t\n\u000B\f\r" +
+        "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+        "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+        "\u0020\u0021\"\u0023\u0024\u0025\u0026\'" +
+        "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" +
+        "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" +
+        "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" +
+        "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" +
+        "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" +
+        "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" +
+        "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" +
+        "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" +
+        "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" +
+        "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" +
+        "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u00A5\u203E";
+
+     // Subset of chars sourced from JISX0208:1983
+
+     private final static String JISX0208SUBSET =
+        "u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+        "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+        "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+        "\u4EDD\u3005\u3006\u3007\u30FC\u2014\u2010\uFF0F" +
+        "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+        "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+        "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+        "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+        "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+        "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+        "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+        "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+        "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+        "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+        "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+        "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+        "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+        "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+        "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+        "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+        "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+        "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+        "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+        "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+        "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+        "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+        "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+        "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+        "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+        "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+        "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+        "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+        "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+        "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+        "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+        "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+        "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+        "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+        "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+        "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+        "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+        "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+        "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+        "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+        "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+        "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+        "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+        "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+        "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+        "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+        "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+        "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+        "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+        "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+        "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+        "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+        "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+        "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+        "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+        "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+        "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+        "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+        "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+        "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+        "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+        "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+        "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+        "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+        "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+        "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+    final static String JISX0202KATAKANA =
+        "\uFF61\uFF62\uFF63\uFF64" +
+        "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+        "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+        "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+        "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+        "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+        "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+        "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+        "\uFF9D\uFF9E\uFF9F";
+
+
+    final static byte[] expectedBytes1 = {
+        (byte) 0x0, (byte) 0x1, (byte) 0x2, (byte) 0x3,
+        (byte) 0x4, (byte) 0x5, (byte) 0x6, (byte) 0x7,
+        (byte) 0x8, (byte) 0x9, (byte) 0xa, (byte) 0xb,
+        (byte) 0xc, (byte) 0xd,
+        (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13,
+        (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17,
+        (byte) 0x18, (byte) 0x19, (byte) 0x1a,
+        (byte) 0x1c, (byte) 0x1d, (byte) 0x1e, (byte) 0x1f,
+        (byte) 0x20, (byte) 0x21, (byte) 0x22, (byte) 0x23,
+        (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27,
+        (byte) 0x28, (byte) 0x29, (byte) 0x2a, (byte) 0x2b,
+        (byte) 0x2c, (byte) 0x2d, (byte) 0x2e, (byte) 0x2f,
+        (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33,
+        (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37,
+        (byte) 0x38, (byte) 0x39, (byte) 0x3a, (byte) 0x3b,
+        (byte) 0x3c, (byte) 0x3d, (byte) 0x3e, (byte) 0x3f,
+        (byte) 0x40, (byte) 0x41, (byte) 0x42, (byte) 0x43,
+        (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47,
+        (byte) 0x48, (byte) 0x49, (byte) 0x4a, (byte) 0x4b,
+        (byte) 0x4c, (byte) 0x4d, (byte) 0x4e, (byte) 0x4f,
+        (byte) 0x50, (byte) 0x51, (byte) 0x52, (byte) 0x53,
+        (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57,
+        (byte) 0x58, (byte) 0x59, (byte) 0x5a, (byte) 0x5b,
+        (byte) 0x5c, (byte) 0x5d, (byte) 0x5e, (byte) 0x5f,
+        (byte) 0x60, (byte) 0x61, (byte) 0x62, (byte) 0x63,
+        (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67,
+        (byte) 0x68, (byte) 0x69, (byte) 0x6a, (byte) 0x6b,
+        (byte) 0x6c, (byte) 0x6d, (byte) 0x6e, (byte) 0x6f,
+        (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73,
+        (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77,
+        (byte) 0x78, (byte) 0x79, (byte) 0x7a, (byte) 0x7b,
+        (byte) 0x7c, (byte) 0x7d, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x5c, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42, (byte) 0x75,
+        (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x30,
+        (byte) 0x1b, (byte) 0x24, (byte) 0x42, (byte) 0x21,
+        (byte) 0x22, (byte) 0x21, (byte) 0x23, (byte) 0x21,
+        (byte) 0x24, (byte) 0x21, (byte) 0x25, (byte) 0x21,
+        (byte) 0x26, (byte) 0x21, (byte) 0x27, (byte) 0x21,
+        (byte) 0x28, (byte) 0x21, (byte) 0x29, (byte) 0x21,
+        (byte) 0x2a, (byte) 0x21, (byte) 0x2b, (byte) 0x21,
+        (byte) 0x2c, (byte) 0x21, (byte) 0x2d, (byte) 0x21,
+        (byte) 0x2e, (byte) 0x21, (byte) 0x2f, (byte) 0x21,
+        (byte) 0x30, (byte) 0x21, (byte) 0x31, (byte) 0x21,
+        (byte) 0x32, (byte) 0x21, (byte) 0x33, (byte) 0x21,
+        (byte) 0x34, (byte) 0x21, (byte) 0x35, (byte) 0x21,
+        (byte) 0x36, (byte) 0x21, (byte) 0x37, (byte) 0x21,
+        (byte) 0x38, (byte) 0x21, (byte) 0x39, (byte) 0x21,
+        (byte) 0x3a, (byte) 0x21, (byte) 0x3b, (byte) 0x21,
+        (byte) 0x3c, (byte) 0x21, (byte) 0x3d, (byte) 0x21,
+        (byte) 0x3e, (byte) 0x21, (byte) 0x3f, (byte) 0x21,
+        (byte) 0x40, (byte) 0x21, (byte) 0x41, (byte) 0x21,
+        (byte) 0x42, (byte) 0x21, (byte) 0x43, (byte) 0x21,
+        (byte) 0x44, (byte) 0x21, (byte) 0x45, (byte) 0x21,
+        (byte) 0x46, (byte) 0x21, (byte) 0x47, (byte) 0x55,
+        (byte) 0x71, (byte) 0x55, (byte) 0x72, (byte) 0x55,
+        (byte) 0x73, (byte) 0x55, (byte) 0x74, (byte) 0x55,
+        (byte) 0x75, (byte) 0x55, (byte) 0x76, (byte) 0x55,
+        (byte) 0x77, (byte) 0x55, (byte) 0x78, (byte) 0x55,
+        (byte) 0x79, (byte) 0x55, (byte) 0x7a, (byte) 0x55,
+        (byte) 0x7b, (byte) 0x55, (byte) 0x7c, (byte) 0x55,
+        (byte) 0x7d, (byte) 0x55, (byte) 0x7e, (byte) 0x56,
+        (byte) 0x21, (byte) 0x56, (byte) 0x22, (byte) 0x56,
+        (byte) 0x23, (byte) 0x56, (byte) 0x24, (byte) 0x56,
+        (byte) 0x25, (byte) 0x56, (byte) 0x26, (byte) 0x56,
+        (byte) 0x27, (byte) 0x56, (byte) 0x28, (byte) 0x56,
+        (byte) 0x29, (byte) 0x56, (byte) 0x2a, (byte) 0x56,
+        (byte) 0x2b, (byte) 0x56, (byte) 0x2c, (byte) 0x56,
+        (byte) 0x2d, (byte) 0x56, (byte) 0x2e, (byte) 0x56,
+        (byte) 0x2f, (byte) 0x56, (byte) 0x30, (byte) 0x56,
+        (byte) 0x31, (byte) 0x56, (byte) 0x32, (byte) 0x56,
+        (byte) 0x33, (byte) 0x56, (byte) 0x34, (byte) 0x56,
+        (byte) 0x35, (byte) 0x56, (byte) 0x36, (byte) 0x56,
+        (byte) 0x37, (byte) 0x56, (byte) 0x38, (byte) 0x56,
+        (byte) 0x39, (byte) 0x56, (byte) 0x3a, (byte) 0x56,
+        (byte) 0x3b, (byte) 0x56, (byte) 0x3c, (byte) 0x56,
+        (byte) 0x3d, (byte) 0x56, (byte) 0x3e, (byte) 0x56,
+        (byte) 0x3f, (byte) 0x56, (byte) 0x40, (byte) 0x56,
+        (byte) 0x41, (byte) 0x56, (byte) 0x42, (byte) 0x56,
+        (byte) 0x43, (byte) 0x56, (byte) 0x44, (byte) 0x56,
+        (byte) 0x45, (byte) 0x56, (byte) 0x46, (byte) 0x56,
+        (byte) 0x47, (byte) 0x56, (byte) 0x48, (byte) 0x56,
+        (byte) 0x49, (byte) 0x56, (byte) 0x4a, (byte) 0x56,
+        (byte) 0x4b, (byte) 0x56, (byte) 0x4c, (byte) 0x56,
+        (byte) 0x4d, (byte) 0x56, (byte) 0x4e, (byte) 0x56,
+        (byte) 0x4f, (byte) 0x56, (byte) 0x50, (byte) 0x56,
+        (byte) 0x51, (byte) 0x56, (byte) 0x52, (byte) 0x56,
+        (byte) 0x53, (byte) 0x56, (byte) 0x54, (byte) 0x56,
+        (byte) 0x55, (byte) 0x56, (byte) 0x56, (byte) 0x56,
+        (byte) 0x57, (byte) 0x56, (byte) 0x58, (byte) 0x56,
+        (byte) 0x59, (byte) 0x56, (byte) 0x5a, (byte) 0x56,
+        (byte) 0x5b, (byte) 0x56, (byte) 0x5c, (byte) 0x56,
+        (byte) 0x5d, (byte) 0x56, (byte) 0x5e, (byte) 0x56,
+        (byte) 0x5f, (byte) 0x56, (byte) 0x60, (byte) 0x56,
+        (byte) 0x61, (byte) 0x56, (byte) 0x62, (byte) 0x56,
+        (byte) 0x63, (byte) 0x56, (byte) 0x64, (byte) 0x56,
+        (byte) 0x65, (byte) 0x56, (byte) 0x66, (byte) 0x56,
+        (byte) 0x67, (byte) 0x56, (byte) 0x68, (byte) 0x56,
+        (byte) 0x69, (byte) 0x56, (byte) 0x6a, (byte) 0x56,
+        (byte) 0x6b, (byte) 0x56, (byte) 0x6c, (byte) 0x56,
+        (byte) 0x6d, (byte) 0x56, (byte) 0x6e, (byte) 0x56,
+        (byte) 0x6f, (byte) 0x56, (byte) 0x70, (byte) 0x56,
+        (byte) 0x71, (byte) 0x56, (byte) 0x72, (byte) 0x56,
+        (byte) 0x73, (byte) 0x56, (byte) 0x74, (byte) 0x56,
+        (byte) 0x75, (byte) 0x56, (byte) 0x76, (byte) 0x56,
+        (byte) 0x77, (byte) 0x56, (byte) 0x78, (byte) 0x56,
+        (byte) 0x79, (byte) 0x56, (byte) 0x7a, (byte) 0x56,
+        (byte) 0x7b, (byte) 0x56, (byte) 0x7c, (byte) 0x56,
+        (byte) 0x7d, (byte) 0x56, (byte) 0x7e, (byte) 0x57,
+        (byte) 0x21, (byte) 0x57, (byte) 0x22, (byte) 0x57,
+        (byte) 0x23, (byte) 0x57, (byte) 0x24, (byte) 0x57,
+        (byte) 0x25, (byte) 0x57, (byte) 0x26, (byte) 0x57,
+        (byte) 0x27, (byte) 0x57, (byte) 0x28, (byte) 0x57,
+        (byte) 0x29, (byte) 0x57, (byte) 0x2a, (byte) 0x57,
+        (byte) 0x2b, (byte) 0x57, (byte) 0x2c, (byte) 0x57,
+        (byte) 0x2d, (byte) 0x57, (byte) 0x2e, (byte) 0x57,
+        (byte) 0x2f, (byte) 0x57, (byte) 0x30, (byte) 0x57,
+        (byte) 0x31, (byte) 0x57, (byte) 0x32, (byte) 0x57,
+        (byte) 0x33, (byte) 0x57, (byte) 0x34, (byte) 0x57,
+        (byte) 0x35, (byte) 0x57, (byte) 0x36, (byte) 0x57,
+        (byte) 0x37, (byte) 0x57, (byte) 0x38, (byte) 0x57,
+        (byte) 0x39, (byte) 0x57, (byte) 0x3a, (byte) 0x57,
+        (byte) 0x3b, (byte) 0x57, (byte) 0x3c, (byte) 0x57,
+        (byte) 0x3d, (byte) 0x57, (byte) 0x3e, (byte) 0x57,
+        (byte) 0x3f, (byte) 0x57, (byte) 0x40, (byte) 0x57,
+        (byte) 0x41, (byte) 0x57, (byte) 0x42, (byte) 0x57,
+        (byte) 0x43, (byte) 0x57, (byte) 0x44, (byte) 0x57,
+        (byte) 0x45, (byte) 0x57, (byte) 0x46, (byte) 0x57,
+        (byte) 0x47, (byte) 0x57, (byte) 0x48, (byte) 0x57,
+        (byte) 0x49, (byte) 0x57, (byte) 0x4a, (byte) 0x57,
+        (byte) 0x4b, (byte) 0x57, (byte) 0x4c, (byte) 0x57,
+        (byte) 0x4d, (byte) 0x57, (byte) 0x4e, (byte) 0x57,
+        (byte) 0x4f, (byte) 0x57, (byte) 0x50, (byte) 0x57,
+        (byte) 0x51, (byte) 0x57, (byte) 0x52, (byte) 0x57,
+        (byte) 0x53, (byte) 0x57, (byte) 0x54, (byte) 0x57,
+        (byte) 0x55, (byte) 0x57, (byte) 0x56, (byte) 0x57,
+        (byte) 0x57, (byte) 0x57, (byte) 0x58, (byte) 0x57,
+        (byte) 0x59, (byte) 0x57, (byte) 0x5a, (byte) 0x57,
+        (byte) 0x5b, (byte) 0x57, (byte) 0x5c, (byte) 0x57,
+        (byte) 0x5d, (byte) 0x57, (byte) 0x5e, (byte) 0x57,
+        (byte) 0x5f, (byte) 0x57, (byte) 0x60, (byte) 0x57,
+        (byte) 0x61, (byte) 0x57, (byte) 0x62, (byte) 0x57,
+        (byte) 0x63, (byte) 0x57, (byte) 0x64, (byte) 0x59,
+        (byte) 0x49, (byte) 0x59, (byte) 0x4a, (byte) 0x59,
+        (byte) 0x4b, (byte) 0x59, (byte) 0x4c, (byte) 0x59,
+        (byte) 0x4d, (byte) 0x59, (byte) 0x4e, (byte) 0x59,
+        (byte) 0x4f, (byte) 0x59, (byte) 0x50, (byte) 0x59,
+        (byte) 0x51, (byte) 0x59, (byte) 0x52, (byte) 0x59,
+        (byte) 0x53, (byte) 0x59, (byte) 0x54, (byte) 0x59,
+        (byte) 0x55, (byte) 0x59, (byte) 0x56, (byte) 0x59,
+        (byte) 0x57, (byte) 0x59, (byte) 0x58, (byte) 0x59,
+        (byte) 0x59, (byte) 0x59, (byte) 0x5a, (byte) 0x59,
+        (byte) 0x5b, (byte) 0x59, (byte) 0x5c, (byte) 0x59,
+        (byte) 0x5d, (byte) 0x59, (byte) 0x5e, (byte) 0x59,
+        (byte) 0x5f, (byte) 0x59, (byte) 0x60, (byte) 0x59,
+        (byte) 0x61, (byte) 0x59, (byte) 0x62, (byte) 0x59,
+        (byte) 0x63, (byte) 0x59, (byte) 0x64, (byte) 0x59,
+        (byte) 0x65, (byte) 0x59, (byte) 0x66, (byte) 0x59,
+        (byte) 0x67, (byte) 0x59, (byte) 0x68, (byte) 0x59,
+        (byte) 0x69, (byte) 0x59, (byte) 0x6a, (byte) 0x59,
+        (byte) 0x6b, (byte) 0x59, (byte) 0x6c, (byte) 0x59,
+        (byte) 0x6d, (byte) 0x59, (byte) 0x6e, (byte) 0x59,
+        (byte) 0x6f, (byte) 0x59, (byte) 0x70, (byte) 0x59,
+        (byte) 0x71, (byte) 0x59, (byte) 0x72, (byte) 0x59,
+        (byte) 0x73, (byte) 0x59, (byte) 0x74, (byte) 0x59,
+        (byte) 0x75, (byte) 0x59, (byte) 0x76, (byte) 0x59,
+        (byte) 0x77, (byte) 0x59, (byte) 0x78, (byte) 0x59,
+        (byte) 0x79, (byte) 0x59, (byte) 0x7a, (byte) 0x59,
+        (byte) 0x7b, (byte) 0x59, (byte) 0x7c, (byte) 0x59,
+        (byte) 0x7d, (byte) 0x59, (byte) 0x7e, (byte) 0x5a,
+        (byte) 0x21, (byte) 0x5a, (byte) 0x22, (byte) 0x5a,
+        (byte) 0x23, (byte) 0x5a, (byte) 0x24, (byte) 0x5a,
+        (byte) 0x25, (byte) 0x5a, (byte) 0x26, (byte) 0x5a,
+        (byte) 0x27, (byte) 0x5a, (byte) 0x28, (byte) 0x5a,
+        (byte) 0x29, (byte) 0x5a, (byte) 0x2a, (byte) 0x5a,
+        (byte) 0x2b, (byte) 0x5a, (byte) 0x2c, (byte) 0x5a,
+        (byte) 0x2d, (byte) 0x5a, (byte) 0x2e, (byte) 0x5a,
+        (byte) 0x2f, (byte) 0x5a, (byte) 0x30, (byte) 0x5a,
+        (byte) 0x31, (byte) 0x5a, (byte) 0x32, (byte) 0x5a,
+        (byte) 0x33, (byte) 0x5a, (byte) 0x34, (byte) 0x5a,
+        (byte) 0x35, (byte) 0x5a, (byte) 0x36, (byte) 0x5a,
+        (byte) 0x37, (byte) 0x5a, (byte) 0x38, (byte) 0x5a,
+        (byte) 0x39, (byte) 0x5a, (byte) 0x3a, (byte) 0x5a,
+        (byte) 0x3b, (byte) 0x5a, (byte) 0x3c, (byte) 0x5a,
+        (byte) 0x3d, (byte) 0x5a, (byte) 0x3e, (byte) 0x5a,
+        (byte) 0x3f, (byte) 0x5a, (byte) 0x40, (byte) 0x5a,
+        (byte) 0x41, (byte) 0x5a, (byte) 0x42, (byte) 0x5b,
+        (byte) 0x35, (byte) 0x5b, (byte) 0x36, (byte) 0x5b,
+        (byte) 0x37, (byte) 0x5b, (byte) 0x38, (byte) 0x5b,
+        (byte) 0x39, (byte) 0x5b, (byte) 0x3a, (byte) 0x5b,
+        (byte) 0x3b, (byte) 0x5b, (byte) 0x3c, (byte) 0x5b,
+        (byte) 0x3d, (byte) 0x5b, (byte) 0x3e, (byte) 0x5b,
+        (byte) 0x3f, (byte) 0x5b, (byte) 0x40, (byte) 0x5b,
+        (byte) 0x41, (byte) 0x5b, (byte) 0x42, (byte) 0x5b,
+        (byte) 0x43, (byte) 0x5b, (byte) 0x44, (byte) 0x5b,
+        (byte) 0x45, (byte) 0x5b, (byte) 0x46, (byte) 0x5b,
+        (byte) 0x47, (byte) 0x5b, (byte) 0x48, (byte) 0x5b,
+        (byte) 0x49, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b,
+        (byte) 0x4b, (byte) 0x5b, (byte) 0x4c, (byte) 0x5b,
+        (byte) 0x4d, (byte) 0x5b, (byte) 0x4e, (byte) 0x5b,
+        (byte) 0x4f, (byte) 0x5b, (byte) 0x50, (byte) 0x5b,
+        (byte) 0x51, (byte) 0x5b, (byte) 0x52, (byte) 0x5b,
+        (byte) 0x53, (byte) 0x5b, (byte) 0x54, (byte) 0x5b,
+        (byte) 0x55, (byte) 0x5b, (byte) 0x56, (byte) 0x5b,
+        (byte) 0x57, (byte) 0x5b, (byte) 0x58, (byte) 0x5b,
+        (byte) 0x59, (byte) 0x5b, (byte) 0x5a, (byte) 0x5b,
+        (byte) 0x5b, (byte) 0x5b, (byte) 0x5c, (byte) 0x5b,
+        (byte) 0x5d, (byte) 0x5b, (byte) 0x5e, (byte) 0x5b,
+        (byte) 0x5f, (byte) 0x5b, (byte) 0x60, (byte) 0x5b,
+        (byte) 0x61, (byte) 0x5b, (byte) 0x62, (byte) 0x5b,
+        (byte) 0x63, (byte) 0x5b, (byte) 0x64, (byte) 0x5b,
+        (byte) 0x65, (byte) 0x5b, (byte) 0x66, (byte) 0x5b,
+        (byte) 0x67, (byte) 0x5b, (byte) 0x68, (byte) 0x5b,
+        (byte) 0x69, (byte) 0x5b, (byte) 0x6a, (byte) 0x5b,
+        (byte) 0x6b, (byte) 0x5b, (byte) 0x6c, (byte) 0x5b,
+        (byte) 0x6d, (byte) 0x5b, (byte) 0x6e, (byte) 0x5b,
+        (byte) 0x6f, (byte) 0x5b, (byte) 0x70, (byte) 0x5b,
+        (byte) 0x71, (byte) 0x5b, (byte) 0x72, (byte) 0x5b,
+        (byte) 0x73, (byte) 0x5b, (byte) 0x74, (byte) 0x5b,
+        (byte) 0x75, (byte) 0x5b, (byte) 0x76, (byte) 0x5b,
+        (byte) 0x77, (byte) 0x5b, (byte) 0x78, (byte) 0x5b,
+        (byte) 0x79, (byte) 0x5b, (byte) 0x7a, (byte) 0x5b,
+        (byte) 0x7b, (byte) 0x5b, (byte) 0x7c, (byte) 0x5b,
+        (byte) 0x7d, (byte) 0x5b, (byte) 0x7e, (byte) 0x5c,
+        (byte) 0x21, (byte) 0x5c, (byte) 0x22, (byte) 0x5c,
+        (byte) 0x23, (byte) 0x5c, (byte) 0x24, (byte) 0x5c,
+        (byte) 0x25, (byte) 0x5c, (byte) 0x26, (byte) 0x5c,
+        (byte) 0x27, (byte) 0x5c, (byte) 0x28, (byte) 0x5c,
+        (byte) 0x29, (byte) 0x5c, (byte) 0x2a, (byte) 0x5c,
+        (byte) 0x2b, (byte) 0x5c, (byte) 0x2c, (byte) 0x5c,
+        (byte) 0x2d, (byte) 0x5c, (byte) 0x2e, (byte) 0x5c,
+        (byte) 0x2f, (byte) 0x5c, (byte) 0x30, (byte) 0x5c,
+        (byte) 0x31, (byte) 0x5c, (byte) 0x32, (byte) 0x5c,
+        (byte) 0x33, (byte) 0x5c, (byte) 0x34, (byte) 0x5c,
+        (byte) 0x35, (byte) 0x5c, (byte) 0x36, (byte) 0x5d,
+        (byte) 0x79, (byte) 0x5d, (byte) 0x7a, (byte) 0x5d,
+        (byte) 0x7b, (byte) 0x5d, (byte) 0x7c, (byte) 0x5d,
+        (byte) 0x7d, (byte) 0x5d, (byte) 0x7e, (byte) 0x5e,
+        (byte) 0x21, (byte) 0x5e, (byte) 0x22, (byte) 0x5e,
+        (byte) 0x23, (byte) 0x5e, (byte) 0x24, (byte) 0x5e,
+        (byte) 0x25, (byte) 0x5e, (byte) 0x26, (byte) 0x5e,
+        (byte) 0x27, (byte) 0x5e, (byte) 0x28, (byte) 0x5e,
+        (byte) 0x29, (byte) 0x5e, (byte) 0x2a, (byte) 0x5e,
+        (byte) 0x2b, (byte) 0x5e, (byte) 0x2c, (byte) 0x5e,
+        (byte) 0x2d, (byte) 0x5e, (byte) 0x2e, (byte) 0x5e,
+        (byte) 0x2f, (byte) 0x5e, (byte) 0x30, (byte) 0x5e,
+        (byte) 0x31, (byte) 0x5e, (byte) 0x32, (byte) 0x5e,
+        (byte) 0x33, (byte) 0x5e, (byte) 0x34, (byte) 0x5e,
+        (byte) 0x35, (byte) 0x5e, (byte) 0x36, (byte) 0x5e,
+        (byte) 0x37, (byte) 0x5e, (byte) 0x38, (byte) 0x5e,
+        (byte) 0x39, (byte) 0x5e, (byte) 0x3a, (byte) 0x5e,
+        (byte) 0x3b, (byte) 0x5e, (byte) 0x3c, (byte) 0x5e,
+        (byte) 0x3d, (byte) 0x5e, (byte) 0x3e, (byte) 0x5e,
+        (byte) 0x3f, (byte) 0x5e, (byte) 0x40, (byte) 0x5e,
+        (byte) 0x41, (byte) 0x5e, (byte) 0x42, (byte) 0x5e,
+        (byte) 0x43, (byte) 0x5e, (byte) 0x44, (byte) 0x5e,
+        (byte) 0x45, (byte) 0x5e, (byte) 0x46, (byte) 0x5e,
+        (byte) 0x47, (byte) 0x5e, (byte) 0x48, (byte) 0x5e,
+        (byte) 0x49, (byte) 0x5e, (byte) 0x4a, (byte) 0x60,
+        (byte) 0x30, (byte) 0x60, (byte) 0x31, (byte) 0x60,
+        (byte) 0x32, (byte) 0x60, (byte) 0x33, (byte) 0x60,
+        (byte) 0x34, (byte) 0x60, (byte) 0x35, (byte) 0x60,
+        (byte) 0x36, (byte) 0x60, (byte) 0x37, (byte) 0x60,
+        (byte) 0x38, (byte) 0x60, (byte) 0x39, (byte) 0x60,
+        (byte) 0x3a, (byte) 0x60, (byte) 0x3b, (byte) 0x60,
+        (byte) 0x3c, (byte) 0x60, (byte) 0x3d, (byte) 0x60,
+        (byte) 0x3e, (byte) 0x60, (byte) 0x3f, (byte) 0x73,
+        (byte) 0x26, (byte) 0x73, (byte) 0x27, (byte) 0x73,
+        (byte) 0x28, (byte) 0x73, (byte) 0x29, (byte) 0x73,
+        (byte) 0x2a, (byte) 0x73, (byte) 0x2b, (byte) 0x73,
+        (byte) 0x2c, (byte) 0x73, (byte) 0x2d, (byte) 0x73,
+        (byte) 0x2e, (byte) 0x73, (byte) 0x2f, (byte) 0x73,
+        (byte) 0x30, (byte) 0x73, (byte) 0x31, (byte) 0x73,
+        (byte) 0x32, (byte) 0x73, (byte) 0x33, (byte) 0x73,
+        (byte) 0x34, (byte) 0x73, (byte) 0x35, (byte) 0x73,
+        (byte) 0x36, (byte) 0x73, (byte) 0x37, (byte) 0x73,
+        (byte) 0x38, (byte) 0x73, (byte) 0x39, (byte) 0x73,
+        (byte) 0x3a, (byte) 0x73, (byte) 0x3b, (byte) 0x73,
+        (byte) 0x3c, (byte) 0x73, (byte) 0x3d, (byte) 0x73,
+        (byte) 0x3e, (byte) 0x73, (byte) 0x3f, (byte) 0x73,
+        (byte) 0x40, (byte) 0x73, (byte) 0x41, (byte) 0x73,
+        (byte) 0x42, (byte) 0x73, (byte) 0x43, (byte) 0x73,
+        (byte) 0x44, (byte) 0x73, (byte) 0x45, (byte) 0x73,
+        (byte) 0x46, (byte) 0x73, (byte) 0x47, (byte) 0x73,
+        (byte) 0x48, (byte) 0x73, (byte) 0x49, (byte) 0x73,
+        (byte) 0x4a, (byte) 0x73, (byte) 0x4b, (byte) 0x73,
+        (byte) 0x4c, (byte) 0x73, (byte) 0x4d, (byte) 0x73,
+        (byte) 0x4e, (byte) 0x73, (byte) 0x4f, (byte) 0x73,
+        (byte) 0x50, (byte) 0x73, (byte) 0x51, (byte) 0x73,
+        (byte) 0x52, (byte) 0x73, (byte) 0x53, (byte) 0x73,
+        (byte) 0x54, (byte) 0x73, (byte) 0x55, (byte) 0x73,
+        (byte) 0x56, (byte) 0x73, (byte) 0x57, (byte) 0x73,
+        (byte) 0x58, (byte) 0x73, (byte) 0x59, (byte) 0x73,
+        (byte) 0x5a, (byte) 0x73, (byte) 0x5b, (byte) 0x73,
+        (byte) 0x5c, (byte) 0x73, (byte) 0x5d, (byte) 0x73,
+        (byte) 0x5e, (byte) 0x73, (byte) 0x5f, (byte) 0x73,
+        (byte) 0x60, (byte) 0x73, (byte) 0x61, (byte) 0x73,
+        (byte) 0x62, (byte) 0x73, (byte) 0x63, (byte) 0x73,
+        (byte) 0x64, (byte) 0x73, (byte) 0x65, (byte) 0x73,
+        (byte) 0x66, (byte) 0x73, (byte) 0x67, (byte) 0x73,
+        (byte) 0x68, (byte) 0x73, (byte) 0x69, (byte) 0x73,
+        (byte) 0x6a, (byte) 0x73, (byte) 0x6b, (byte) 0x73,
+        (byte) 0x6c, (byte) 0x73, (byte) 0x6d, (byte) 0x73,
+        (byte) 0x6e, (byte) 0x73, (byte) 0x6f, (byte) 0x73,
+        (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x73,
+        (byte) 0x72, (byte) 0x73, (byte) 0x73, (byte) 0x73,
+        (byte) 0x74, (byte) 0x73, (byte) 0x75, (byte) 0x73,
+        (byte) 0x76, (byte) 0x73, (byte) 0x77, (byte) 0x73,
+        (byte) 0x78, (byte) 0x73, (byte) 0x79, (byte) 0x73,
+        (byte) 0x7a, (byte) 0x73, (byte) 0x7b, (byte) 0x73,
+        (byte) 0x7c, (byte) 0x73, (byte) 0x7d, (byte) 0x73,
+        (byte) 0x7e, (byte) 0x74, (byte) 0x21, (byte) 0x74,
+        (byte) 0x22, (byte) 0x74, (byte) 0x23, (byte) 0x74,
+        (byte) 0x24, (byte) 0x74, (byte) 0x25, (byte) 0x74,
+        (byte) 0x26, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte) 0x21, (byte) 0x22, (byte) 0x23, (byte) 0x24,
+        (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28,
+        (byte) 0x29, (byte) 0x2a, (byte) 0x2b, (byte) 0x2c,
+        (byte) 0x2d, (byte) 0x2e, (byte) 0x2f, (byte) 0x30,
+        (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x34,
+        (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38,
+        (byte) 0x39, (byte) 0x3a, (byte) 0x3b, (byte) 0x3c,
+        (byte) 0x3d, (byte) 0x3e, (byte) 0x3f, (byte) 0x40,
+        (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44,
+        (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48,
+        (byte) 0x49, (byte) 0x4a, (byte) 0x4b, (byte) 0x4c,
+        (byte) 0x4d, (byte) 0x4e, (byte) 0x4f, (byte) 0x50,
+        (byte) 0x51, (byte) 0x52, (byte) 0x53, (byte) 0x54,
+        (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58,
+        (byte) 0x59, (byte) 0x5a, (byte) 0x5b, (byte) 0x5c,
+        (byte) 0x5d, (byte) 0x5e, (byte) 0x5f, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42 };
+
+    private final static String MIXEDCONTENT =
+        "JA\u3000\u3002\u0062\uFF64PAN" +
+        "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+        "\u30FB\uFF67\u203E";
+
+    static byte[] mixedBytesExpected = {
+        (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+        (byte) 0x42, (byte) 0x21, (byte) 0x21, (byte) 0x21,
+        (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x50, (byte) 0x41, (byte) 0x4e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+        (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42  };
+
+    static byte[] repeatingEscapes = {
+        (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+        (byte) 0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte) 0x21, (byte) 0x21, (byte) 0x21,
+        (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        // embedded repeated iso-2022 escapes (see bugID 4879522)
+        (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte)0x0f, (byte)0x0e, (byte)0x0f,
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x50, (byte) 0x41, (byte) 0x4e,
+        // embedded shift chars (see bugID 4879522)
+        (byte)0x0e, (byte)0x0f,
+        (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+        (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42  };
+
+
+    private static String JISX0212 =
+        "\u02d8\u6896\u9fa5";
+
+    private static byte[] expectedBytes_JISX0212 = {
+        (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+        (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+        (byte)0x6d, (byte)0x63,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing a substantial
+     * subset of ISO-2022-JP/ISO-2022-JP-2 encodeable chars
+     */
+
+    private static void roundTrip(String testStr, byte[] expectBytes,
+                                  String csName)
+    throws Exception {
+        byte[] encodedBytes = testStr.getBytes(csName);
+
+        if (encodedBytes.length != expectBytes.length) {
+            throw new Exception(csName + " Encoder error");
+        }
+
+        for (int i = 0; i < expectBytes.length; i++) {
+            if (encodedBytes[i] != expectBytes[i])  {
+                throw new Exception(csName + " Encoder error");
+            }
+        }
+        String decoded = new String(encodedBytes, csName);
+
+        if (!decoded.equals(testStr)) {
+            throw new Exception(csName + " Decoder error");
+        }
+        String decoded2 = new String(repeatingEscapes, csName);
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception(csName + " Decoder error");
+        }
+     }
+
+    public static void main(String[] args) throws Exception {
+
+        // Long String containing sequential chars
+        // ASCII/yen/tilde/jisx0208 chars/katakana chars
+
+        String testStr1 = US_ASCII +
+                        JISX0208SUBSET + JISX0202KATAKANA;
+        roundTrip(testStr1, expectedBytes1, "ISO-2022-JP");
+        roundTrip(testStr1, expectedBytes1, "ISO-2022-JP-2");
+        roundTrip(JISX0212, expectedBytes_JISX0212, "ISO-2022-JP-2");
+
+        // mixed chars which encode to the supported codesets
+        // of ISO-2022-JP/ISO-2022-JP-2
+
+        String testStr2 = MIXEDCONTENT;
+        roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP");
+        roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP-2");
+
+        String decoded2 = new String(repeatingEscapes, "ISO-2022-JP");
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception("ISO-2022-JP Decoder error");
+        }
+
+        decoded2 = new String(repeatingEscapes, "ISO-2022-JP-2");
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception("ISO-2022-JP-2 Decoder error");
+        }
+
+        // Test for bugID 4913711
+        // ISO-2022-JP encoding of a single input char yields
+        // 8 output bytes. Prior to fix for 4913711 the
+        // max bytes per char value was underspecified as 5.0
+        // and the code below would have thrown a BufferOverflow
+        // exception. This test validates the fix for 4913711
+
+        String testStr3 = "\u3042";
+        byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+                            (byte)0x24, (byte)0x22, (byte)0x1b,
+                            (byte)0x28, (byte)0x42 };
+        byte[] encoded = testStr3.getBytes("ISO-2022-JP");
+        for (int i = 0; i < expected.length; i++) {
+            if (encoded[i] != expected[i])
+               throw new Exception("ISO-2022-JP Decoder error");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java
new file mode 100644
index 0000000..ec2cbff
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4251646
+   @summary Make sure buffer boundary convert works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPEncoder {
+    static char[] inputChars = {'\u0020', '\u0020', '\u0020', '\u0020',
+                                '\u0020', '\u0020', '\u0020', '\u0020',
+                                '\u0020', '\u4e00'};
+    static byte[] expectedBytes1 = {0x20, 0x20, 0x20, 0x20, 0x20,
+                                    0x20, 0x20, 0x20, 0x20};
+    static byte[] expectedBytes2 = {0x1b, 0x24, 0x42, 0x30, 0x6c,
+                                    0x1b, 0x28, 0x42};
+    static byte[] outputBuff = new byte[10];
+
+    public static void main(String args[]) throws Exception {
+        CharsetEncoder enc = Charset.forName("ISO2022JP").newEncoder();
+        CharBuffer cb = CharBuffer.wrap(inputChars);
+        ByteBuffer bb = ByteBuffer.wrap(outputBuff);
+        CoderResult cr = enc.encode(cb, bb, false);
+        if (!cr.isOverflow())
+            throw new Exception("Expected CodeResult.OVERFLOW was not returned");
+        for (int i = 0; i < expectedBytes1.length; ++i) {
+            //System.out.println(expectedBytes1[i] + ":" + outputBuff[i]);
+            if (expectedBytes1[i] != outputBuff[i]) {
+                throw new Exception("Output bytes does not match at first conversion");
+            }
+        }
+        int nci = cb.position();
+        if (nci != expectedBytes1.length)
+            throw new Exception("Output length does not match at first conversion");
+        bb.clear();
+        cr = enc.encode(cb, bb, true);
+        enc.flush(bb);
+        //System.out.println(ret + "," + expectedBytes2.length);
+        bb.flip();
+        int len = bb.remaining();
+        if (len != expectedBytes2.length)
+            throw new Exception("Output length does not match at second conversion");
+        for (int i = 0; i < expectedBytes2.length; ++i) {
+            //System.out.println(expectedBytes2[i] + ":" + outputBuff[i]);
+            if (expectedBytes2[i] != outputBuff[i]) {
+                throw new Exception("Output bytes does not match at second conversion");
+            }
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java
new file mode 100644
index 0000000..7dc3852
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4262894 6233303
+   @summary Testing substitute character Escape sequence
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPSubBytes {
+    /* \U2460 is not valid character in ISO2022JP and will be substituted
+     * with replacement character. If the replacement character is not the
+     * "current charset" character, correct escape sequence should be output
+     * for changing character set.
+     */
+    static char[][] in = { {'\u25cb', '\u2460', '\u25cb'},
+                           {'\u0061', '\u2460', '\u0061'},
+                           {'\u25cb', '\u2460', '\u25cb'},
+                           {'\u0061', '\u2460', '\u0061'},
+                         };
+    static byte[][] expected = { {0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x21, 0x29,
+                                  0x21, 0x7b,
+                                  0x1b, 0x28, 0x42},
+                                 {0x61,
+                                  0x1b, 0x24, 0x42, 0x21, 0x29,
+                                  0x1b, 0x28, 0x42, 0x61},
+                                 {0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x1b, 0x28, 0x42, 0x3f,
+                                  0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x1b, 0x28, 0x42},
+                                 {0x61,
+                                  0x3f,
+                                  0x61}
+                                };
+
+    public static void main(String args[]) throws Exception {
+        CharsetEncoder enc = Charset.forName("ISO2022JP")
+          .newEncoder()
+          .onUnmappableCharacter(CodingErrorAction.REPLACE);
+
+        test(enc, in[0], expected[0]);
+
+        enc.reset();
+        test(enc, in[1], expected[1]);
+
+        enc.reset();
+        enc.replaceWith(new byte[]{(byte)'?'});
+        test(enc, in[2], expected[2]);
+
+        enc.reset();
+        test(enc, in[3], expected[3]);
+    }
+
+    public static void test (CharsetEncoder enc,
+                             char[] inputChars,
+                             byte[] expectedBytes) throws Exception
+    {
+        ByteBuffer bb = ByteBuffer.allocate(expectedBytes.length);
+        enc.encode(CharBuffer.wrap(inputChars), bb, true);
+        enc.flush(bb);
+        bb.flip();
+        byte[] outputBuff = bb.array();
+        int outputLen = bb.limit();
+        if (outputLen != expectedBytes.length) {
+            throw new Exception("Output bytes does not match");
+        }
+        for (int i = 0; i < outputLen; ++i) {
+            System.out.printf("<%x:%x> ",
+                              expectedBytes[i] & 0xff,
+                              outputBuff[i] & 0xff);
+            if (expectedBytes[i] != outputBuff[i]) {
+                System.out.println("...");
+                throw new Exception("Output bytes does not match");
+            }
+        }
+        System.out.println();
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java
new file mode 100644
index 0000000..696177f
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4429369
+   @summary  ISO2022CN and ISO2022KR converters throw exception
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class TestIllegalISO2022Esc {
+
+    public static void main ( String[] args) throws Exception {
+        int exceptionCount = 0;
+        String[] encName = {"ISO2022CN", "ISO2022KR" };
+        byte[]b= {
+                (byte)0x1b, //Illegal sequence for both converters.
+                (byte)')',
+                (byte)'x'
+        };
+
+        for ( int i=0; i < 2; i++) { // Test 2 converters.
+            try {
+                ByteArrayInputStream bais = new ByteArrayInputStream(b);
+                    InputStreamReader isr =
+                                new InputStreamReader(bais,encName[i]);
+                    char cc[] = new char[1];
+                    isr.read(cc,0,1); //attempt to read
+            } catch (MalformedInputException e) { } // Passes if thrown
+              catch (Throwable t) {
+                    System.err.println("error with converter " + encName[i]);
+                    exceptionCount++;
+            }
+        }
+
+        if (exceptionCount > 0)
+           throw new Exception ("Incorrect handling of illegal ISO2022 escapes");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestIllegalSJIS.java b/jdk/test/sun/nio/cs/TestIllegalSJIS.java
new file mode 100644
index 0000000..e5562bb
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestIllegalSJIS.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4117820
+   @summary Verify that SJIS.Decoder works properly for values between 0xA000 and 0xA0FC
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class TestIllegalSJIS {
+
+  public static void main(String[] args) throws Exception
+  {
+    CharsetDecoder dec = Charset.forName("SJIS").newDecoder()
+      .onUnmappableCharacter(CodingErrorAction.REPLACE)
+      .onMalformedInput(CodingErrorAction.REPLACE);
+    byte[] sjis      = {(byte)0xA0, (byte)0x00};
+
+    int b;
+    for (b = 0; b < 0xFD; b++) {
+      sjis[1] = (byte) b;
+      CharBuffer cb = dec.decode(ByteBuffer.wrap(sjis));
+      if (cb.charAt(0) != 0xFFFD) {
+        throw new Exception(Integer.toHexString(0xa000 + b) + " failed to convert to 0xFFFD");
+      }
+    }
+  }
+}
diff --git a/jdk/test/sun/nio/cs/TestJIS0208Decoder.java b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java
new file mode 100644
index 0000000..e0bacd8
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4179800
+ * @summary Make sure JIS0208.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0208Decoder {
+    static String outputString = "\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8";
+    static byte [] inputBytes = new byte[] {(byte)'F', (byte)'|', (byte)'K', (byte)'\\',
+                                     (byte)'8', (byte)'l', (byte)'%', (byte)'F',
+                                     (byte)'%', (byte)'-', (byte)'%', (byte)'9',
+                                     (byte)'%', (byte)'H'};
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        CharsetDecoder dec = Charset.forName("JIS0208").newDecoder();
+        try {
+            String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+            if (ret.length() != outputString.length()
+                || ! outputString.equals(ret)){
+                throw new Exception("ByteToCharJIS0208 does not work correctly");
+            }
+        }
+        catch (Exception e){
+            throw new Exception("ByteToCharJIS0208 does not work correctly");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestJIS0212Decoder.java b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java
new file mode 100644
index 0000000..5683616
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+   @bug 4179800
+   @summary Make sure JIS0212.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0212Decoder {
+    static String outputString = "\u4e02\u4e04\u4e05\u4e0c\u4e12\u4e1f\u4e23";
+    static char [] outputChars = new char[8];
+    static byte [] inputBytes = new byte[] {(byte)0x30, (byte)0x21, (byte)0x30, (byte)0x22,
+                                            (byte)0x30, (byte)0x23, (byte)0x30, (byte)0x24,
+                                            (byte)0x30, (byte)0x25, (byte)0x30, (byte)0x26,
+                                            (byte)0x30, (byte)0x27};
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        CharsetDecoder dec = Charset.forName("JIS0212").newDecoder();
+        try {
+            String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+            if (ret.length() != outputString.length()
+                || ! outputString.equals(ret)){
+                throw new Exception("ByteToCharJIS0212 does not work correctly");
+            }
+        }
+        catch (Exception e){
+            throw new Exception("ByteToCharJIS0212 does not work correctly");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestMS5022X.java b/jdk/test/sun/nio/cs/TestMS5022X.java
new file mode 100644
index 0000000..e98e3d0
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestMS5022X.java
@@ -0,0 +1,750 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6173388 6319716
+   @summary Check full coverage encode/decode for Microsoft
+            ISO2022_JP variants MS50220, MS50221 and MSISO2022JP
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+public class TestMS5022X {
+
+    private static String US_ASCII =
+        "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+        "\b\t\n\u000B\f\r" +
+        "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+        "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+        "\u0020\u0021\"\u0023\u0024\u0025\u0026\'" +
+        "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F" +
+        "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037" +
+        "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F" +
+        "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047" +
+        "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F" +
+        "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057" +
+        "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F" +
+        "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067" +
+        "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F" +
+        "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077" +
+        "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u00A5\u203E";
+
+     // Subset of chars sourced from JISX0208:1983
+
+     private static String JISX0208SUBSET =
+        "\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+        "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+        "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+        "\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F" +    //u2014->u2015
+        "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+        "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+        "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+        "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+        "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+        "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+        "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+        "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+        "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+        "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+        "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+        "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+        "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+        "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+        "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+        "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+        "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+        "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+        "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+        "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+        "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+        "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+        "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+        "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+        "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+        "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+        "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+        "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+        "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+        "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+        "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+        "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+        "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+        "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+        "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+        "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+        "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+        "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+        "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+        "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+        "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+        "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+        "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+        "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+        "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+        "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+        "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+        "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+        "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+        "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+        "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+        "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+        "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+        "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+        "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+        "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+        "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+        "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+        "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+        "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+        "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+        "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+        "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+        "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+        "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+        "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+    private static String JISX0201KATAKANA =
+        "\uFF61\uFF62\uFF63\uFF64" +
+        "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+        "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+        "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+        "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+        "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+        "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+        "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+        "\uFF9D\uFF9E\uFF9F";
+
+    private static String JISX0208NECROW13 =
+        "\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467" +
+        "\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F" +
+        "\u2470\u2471\u2472\u2473\u2160\u2161\u2162\u2163" +
+        "\u2164\u2165\u2166\u2167\u2168\u2169\u3349\u3314" +
+        "\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357" +
+        "\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D" +
+        "\u339E\u338E\u338F\u33C4\u33A1\u337B\u301E\u301F" +
+        "\u2116\u33CD\u2121\u32A4\u32A5\u32A6\u32A7\u32A8" +
+        "\u3231\u3232\u3239\u337E\u337D\u337C" +
+        "\u222e\u2211\u221f\u22bf";
+
+    private static byte[] expectedBytes_US_ASCII = {
+        (byte)0x0, (byte)0x1, (byte)0x2, (byte)0x3,
+        (byte)0x4, (byte)0x5, (byte)0x6, (byte)0x7,
+        (byte)0x8, (byte)0x9, (byte)0xa, (byte)0xb,
+        (byte)0xc, (byte)0xd,
+        (byte)0x10, (byte)0x11, (byte)0x12, (byte)0x13,
+        (byte)0x14, (byte)0x15, (byte)0x16, (byte)0x17,
+        (byte)0x18, (byte)0x19, (byte)0x1a,
+        (byte)0x1c, (byte)0x1d, (byte)0x1e, (byte)0x1f,
+        (byte)0x20, (byte)0x21, (byte)0x22, (byte)0x23,
+        (byte)0x24, (byte)0x25, (byte)0x26, (byte)0x27,
+        (byte)0x28, (byte)0x29, (byte)0x2a, (byte)0x2b,
+        (byte)0x2c, (byte)0x2d, (byte)0x2e, (byte)0x2f,
+        (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33,
+        (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37,
+        (byte)0x38, (byte)0x39, (byte)0x3a, (byte)0x3b,
+        (byte)0x3c, (byte)0x3d, (byte)0x3e, (byte)0x3f,
+        (byte)0x40, (byte)0x41, (byte)0x42, (byte)0x43,
+        (byte)0x44, (byte)0x45, (byte)0x46, (byte)0x47,
+        (byte)0x48, (byte)0x49, (byte)0x4a, (byte)0x4b,
+        (byte)0x4c, (byte)0x4d, (byte)0x4e, (byte)0x4f,
+        (byte)0x50, (byte)0x51, (byte)0x52, (byte)0x53,
+        (byte)0x54, (byte)0x55, (byte)0x56, (byte)0x57,
+        (byte)0x58, (byte)0x59, (byte)0x5a, (byte)0x5b,
+        (byte)0x5c, (byte)0x5d, (byte)0x5e, (byte)0x5f,
+        (byte)0x60, (byte)0x61, (byte)0x62, (byte)0x63,
+        (byte)0x64, (byte)0x65, (byte)0x66, (byte)0x67,
+        (byte)0x68, (byte)0x69, (byte)0x6a, (byte)0x6b,
+        (byte)0x6c, (byte)0x6d, (byte)0x6e, (byte)0x6f,
+        (byte)0x70, (byte)0x71, (byte)0x72, (byte)0x73,
+        (byte)0x74, (byte)0x75, (byte)0x76, (byte)0x77,
+        (byte)0x78, (byte)0x79, (byte)0x7a, (byte)0x7b,
+        (byte)0x7c, (byte)0x7d, (byte)0x7e, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x5c, (byte)0x7e
+    };
+
+    private static byte[] expectedBytes_JISX0208SUBSET =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42, (byte)0x21,
+        (byte)0x21, (byte)0x21,
+        (byte)0x22, (byte)0x21, (byte)0x23, (byte)0x21,
+        (byte)0x24, (byte)0x21, (byte)0x25, (byte)0x21,
+        (byte)0x26, (byte)0x21, (byte)0x27, (byte)0x21,
+        (byte)0x28, (byte)0x21, (byte)0x29, (byte)0x21,
+        (byte)0x2a, (byte)0x21, (byte)0x2b, (byte)0x21,
+        (byte)0x2c, (byte)0x21, (byte)0x2d, (byte)0x21,
+        (byte)0x2e, (byte)0x21, (byte)0x2f, (byte)0x21,
+        (byte)0x30, (byte)0x21, (byte)0x31, (byte)0x21,
+        (byte)0x32, (byte)0x21, (byte)0x33, (byte)0x21,
+        (byte)0x34, (byte)0x21, (byte)0x35, (byte)0x21,
+        (byte)0x36, (byte)0x21, (byte)0x37, (byte)0x21,
+        (byte)0x38, (byte)0x21, (byte)0x39, (byte)0x21,
+        (byte)0x3a, (byte)0x21, (byte)0x3b, (byte)0x21,
+        (byte)0x3c, (byte)0x21, (byte)0x3d, (byte)0x21,
+        (byte)0x3e, (byte)0x21, (byte)0x3f, (byte)0x21,
+        (byte)0x40, (byte)0x21, (byte)0x41, (byte)0x21,
+        (byte)0x42, (byte)0x21, (byte)0x43, (byte)0x21,
+        (byte)0x44, (byte)0x21, (byte)0x45, (byte)0x21,
+        (byte)0x46, (byte)0x21, (byte)0x47, (byte)0x55,
+        (byte)0x71, (byte)0x55, (byte)0x72, (byte)0x55,
+        (byte)0x73, (byte)0x55, (byte)0x74, (byte)0x55,
+        (byte)0x75, (byte)0x55, (byte)0x76, (byte)0x55,
+        (byte)0x77, (byte)0x55, (byte)0x78, (byte)0x55,
+        (byte)0x79, (byte)0x55, (byte)0x7a, (byte)0x55,
+        (byte)0x7b, (byte)0x55, (byte)0x7c, (byte)0x55,
+        (byte)0x7d, (byte)0x55, (byte)0x7e, (byte)0x56,
+        (byte)0x21, (byte)0x56, (byte)0x22, (byte)0x56,
+        (byte)0x23, (byte)0x56, (byte)0x24, (byte)0x56,
+        (byte)0x25, (byte)0x56, (byte)0x26, (byte)0x56,
+        (byte)0x27, (byte)0x56, (byte)0x28, (byte)0x56,
+        (byte)0x29, (byte)0x56, (byte)0x2a, (byte)0x56,
+        (byte)0x2b, (byte)0x56, (byte)0x2c, (byte)0x56,
+        (byte)0x2d, (byte)0x56, (byte)0x2e, (byte)0x56,
+        (byte)0x2f, (byte)0x56, (byte)0x30, (byte)0x56,
+        (byte)0x31, (byte)0x56, (byte)0x32, (byte)0x56,
+        (byte)0x33, (byte)0x56, (byte)0x34, (byte)0x56,
+        (byte)0x35, (byte)0x56, (byte)0x36, (byte)0x56,
+        (byte)0x37, (byte)0x56, (byte)0x38, (byte)0x56,
+        (byte)0x39, (byte)0x56, (byte)0x3a, (byte)0x56,
+        (byte)0x3b, (byte)0x56, (byte)0x3c, (byte)0x56,
+        (byte)0x3d, (byte)0x56, (byte)0x3e, (byte)0x56,
+        (byte)0x3f, (byte)0x56, (byte)0x40, (byte)0x56,
+        (byte)0x41, (byte)0x56, (byte)0x42, (byte)0x56,
+        (byte)0x43, (byte)0x56, (byte)0x44, (byte)0x56,
+        (byte)0x45, (byte)0x56, (byte)0x46, (byte)0x56,
+        (byte)0x47, (byte)0x56, (byte)0x48, (byte)0x56,
+        (byte)0x49, (byte)0x56, (byte)0x4a, (byte)0x56,
+        (byte)0x4b, (byte)0x56, (byte)0x4c, (byte)0x56,
+        (byte)0x4d, (byte)0x56, (byte)0x4e, (byte)0x56,
+        (byte)0x4f, (byte)0x56, (byte)0x50, (byte)0x56,
+        (byte)0x51, (byte)0x56, (byte)0x52, (byte)0x56,
+        (byte)0x53, (byte)0x56, (byte)0x54, (byte)0x56,
+        (byte)0x55, (byte)0x56, (byte)0x56, (byte)0x56,
+        (byte)0x57, (byte)0x56, (byte)0x58, (byte)0x56,
+        (byte)0x59, (byte)0x56, (byte)0x5a, (byte)0x56,
+        (byte)0x5b, (byte)0x56, (byte)0x5c, (byte)0x56,
+        (byte)0x5d, (byte)0x56, (byte)0x5e, (byte)0x56,
+        (byte)0x5f, (byte)0x56, (byte)0x60, (byte)0x56,
+        (byte)0x61, (byte)0x56, (byte)0x62, (byte)0x56,
+        (byte)0x63, (byte)0x56, (byte)0x64, (byte)0x56,
+        (byte)0x65, (byte)0x56, (byte)0x66, (byte)0x56,
+        (byte)0x67, (byte)0x56, (byte)0x68, (byte)0x56,
+        (byte)0x69, (byte)0x56, (byte)0x6a, (byte)0x56,
+        (byte)0x6b, (byte)0x56, (byte)0x6c, (byte)0x56,
+        (byte)0x6d, (byte)0x56, (byte)0x6e, (byte)0x56,
+        (byte)0x6f, (byte)0x56, (byte)0x70, (byte)0x56,
+        (byte)0x71, (byte)0x56, (byte)0x72, (byte)0x56,
+        (byte)0x73, (byte)0x56, (byte)0x74, (byte)0x56,
+        (byte)0x75, (byte)0x56, (byte)0x76, (byte)0x56,
+        (byte)0x77, (byte)0x56, (byte)0x78, (byte)0x56,
+        (byte)0x79, (byte)0x56, (byte)0x7a, (byte)0x56,
+        (byte)0x7b, (byte)0x56, (byte)0x7c, (byte)0x56,
+        (byte)0x7d, (byte)0x56, (byte)0x7e, (byte)0x57,
+        (byte)0x21, (byte)0x57, (byte)0x22, (byte)0x57,
+        (byte)0x23, (byte)0x57, (byte)0x24, (byte)0x57,
+        (byte)0x25, (byte)0x57, (byte)0x26, (byte)0x57,
+        (byte)0x27, (byte)0x57, (byte)0x28, (byte)0x57,
+        (byte)0x29, (byte)0x57, (byte)0x2a, (byte)0x57,
+        (byte)0x2b, (byte)0x57, (byte)0x2c, (byte)0x57,
+        (byte)0x2d, (byte)0x57, (byte)0x2e, (byte)0x57,
+        (byte)0x2f, (byte)0x57, (byte)0x30, (byte)0x57,
+        (byte)0x31, (byte)0x57, (byte)0x32, (byte)0x57,
+        (byte)0x33, (byte)0x57, (byte)0x34, (byte)0x57,
+        (byte)0x35, (byte)0x57, (byte)0x36, (byte)0x57,
+        (byte)0x37, (byte)0x57, (byte)0x38, (byte)0x57,
+        (byte)0x39, (byte)0x57, (byte)0x3a, (byte)0x57,
+        (byte)0x3b, (byte)0x57, (byte)0x3c, (byte)0x57,
+        (byte)0x3d, (byte)0x57, (byte)0x3e, (byte)0x57,
+        (byte)0x3f, (byte)0x57, (byte)0x40, (byte)0x57,
+        (byte)0x41, (byte)0x57, (byte)0x42, (byte)0x57,
+        (byte)0x43, (byte)0x57, (byte)0x44, (byte)0x57,
+        (byte)0x45, (byte)0x57, (byte)0x46, (byte)0x57,
+        (byte)0x47, (byte)0x57, (byte)0x48, (byte)0x57,
+        (byte)0x49, (byte)0x57, (byte)0x4a, (byte)0x57,
+        (byte)0x4b, (byte)0x57, (byte)0x4c, (byte)0x57,
+        (byte)0x4d, (byte)0x57, (byte)0x4e, (byte)0x57,
+        (byte)0x4f, (byte)0x57, (byte)0x50, (byte)0x57,
+        (byte)0x51, (byte)0x57, (byte)0x52, (byte)0x57,
+        (byte)0x53, (byte)0x57, (byte)0x54, (byte)0x57,
+        (byte)0x55, (byte)0x57, (byte)0x56, (byte)0x57,
+        (byte)0x57, (byte)0x57, (byte)0x58, (byte)0x57,
+        (byte)0x59, (byte)0x57, (byte)0x5a, (byte)0x57,
+        (byte)0x5b, (byte)0x57, (byte)0x5c, (byte)0x57,
+        (byte)0x5d, (byte)0x57, (byte)0x5e, (byte)0x57,
+        (byte)0x5f, (byte)0x57, (byte)0x60, (byte)0x57,
+        (byte)0x61, (byte)0x57, (byte)0x62, (byte)0x57,
+        (byte)0x63, (byte)0x57, (byte)0x64, (byte)0x59,
+        (byte)0x49, (byte)0x59, (byte)0x4a, (byte)0x59,
+        (byte)0x4b, (byte)0x59, (byte)0x4c, (byte)0x59,
+        (byte)0x4d, (byte)0x59, (byte)0x4e, (byte)0x59,
+        (byte)0x4f, (byte)0x59, (byte)0x50, (byte)0x59,
+        (byte)0x51, (byte)0x59, (byte)0x52, (byte)0x59,
+        (byte)0x53, (byte)0x59, (byte)0x54, (byte)0x59,
+        (byte)0x55, (byte)0x59, (byte)0x56, (byte)0x59,
+        (byte)0x57, (byte)0x59, (byte)0x58, (byte)0x59,
+        (byte)0x59, (byte)0x59, (byte)0x5a, (byte)0x59,
+        (byte)0x5b, (byte)0x59, (byte)0x5c, (byte)0x59,
+        (byte)0x5d, (byte)0x59, (byte)0x5e, (byte)0x59,
+        (byte)0x5f, (byte)0x59, (byte)0x60, (byte)0x59,
+        (byte)0x61, (byte)0x59, (byte)0x62, (byte)0x59,
+        (byte)0x63, (byte)0x59, (byte)0x64, (byte)0x59,
+        (byte)0x65, (byte)0x59, (byte)0x66, (byte)0x59,
+        (byte)0x67, (byte)0x59, (byte)0x68, (byte)0x59,
+        (byte)0x69, (byte)0x59, (byte)0x6a, (byte)0x59,
+        (byte)0x6b, (byte)0x59, (byte)0x6c, (byte)0x59,
+        (byte)0x6d, (byte)0x59, (byte)0x6e, (byte)0x59,
+        (byte)0x6f, (byte)0x59, (byte)0x70, (byte)0x59,
+        (byte)0x71, (byte)0x59, (byte)0x72, (byte)0x59,
+        (byte)0x73, (byte)0x59, (byte)0x74, (byte)0x59,
+        (byte)0x75, (byte)0x59, (byte)0x76, (byte)0x59,
+        (byte)0x77, (byte)0x59, (byte)0x78, (byte)0x59,
+        (byte)0x79, (byte)0x59, (byte)0x7a, (byte)0x59,
+        (byte)0x7b, (byte)0x59, (byte)0x7c, (byte)0x59,
+        (byte)0x7d, (byte)0x59, (byte)0x7e, (byte)0x5a,
+        (byte)0x21, (byte)0x5a, (byte)0x22, (byte)0x5a,
+        (byte)0x23, (byte)0x5a, (byte)0x24, (byte)0x5a,
+        (byte)0x25, (byte)0x5a, (byte)0x26, (byte)0x5a,
+        (byte)0x27, (byte)0x5a, (byte)0x28, (byte)0x5a,
+        (byte)0x29, (byte)0x5a, (byte)0x2a, (byte)0x5a,
+        (byte)0x2b, (byte)0x5a, (byte)0x2c, (byte)0x5a,
+        (byte)0x2d, (byte)0x5a, (byte)0x2e, (byte)0x5a,
+        (byte)0x2f, (byte)0x5a, (byte)0x30, (byte)0x5a,
+        (byte)0x31, (byte)0x5a, (byte)0x32, (byte)0x5a,
+        (byte)0x33, (byte)0x5a, (byte)0x34, (byte)0x5a,
+        (byte)0x35, (byte)0x5a, (byte)0x36, (byte)0x5a,
+        (byte)0x37, (byte)0x5a, (byte)0x38, (byte)0x5a,
+        (byte)0x39, (byte)0x5a, (byte)0x3a, (byte)0x5a,
+        (byte)0x3b, (byte)0x5a, (byte)0x3c, (byte)0x5a,
+        (byte)0x3d, (byte)0x5a, (byte)0x3e, (byte)0x5a,
+        (byte)0x3f, (byte)0x5a, (byte)0x40, (byte)0x5a,
+        (byte)0x41, (byte)0x5a, (byte)0x42, (byte)0x5b,
+        (byte)0x35, (byte)0x5b, (byte)0x36, (byte)0x5b,
+        (byte)0x37, (byte)0x5b, (byte)0x38, (byte)0x5b,
+        (byte)0x39, (byte)0x5b, (byte)0x3a, (byte)0x5b,
+        (byte)0x3b, (byte)0x5b, (byte)0x3c, (byte)0x5b,
+        (byte)0x3d, (byte)0x5b, (byte)0x3e, (byte)0x5b,
+        (byte)0x3f, (byte)0x5b, (byte)0x40, (byte)0x5b,
+        (byte)0x41, (byte)0x5b, (byte)0x42, (byte)0x5b,
+        (byte)0x43, (byte)0x5b, (byte)0x44, (byte)0x5b,
+        (byte)0x45, (byte)0x5b, (byte)0x46, (byte)0x5b,
+        (byte)0x47, (byte)0x5b, (byte)0x48, (byte)0x5b,
+        (byte)0x49, (byte)0x5b, (byte)0x4a, (byte)0x5b,
+        (byte)0x4b, (byte)0x5b, (byte)0x4c, (byte)0x5b,
+        (byte)0x4d, (byte)0x5b, (byte)0x4e, (byte)0x5b,
+        (byte)0x4f, (byte)0x5b, (byte)0x50, (byte)0x5b,
+        (byte)0x51, (byte)0x5b, (byte)0x52, (byte)0x5b,
+        (byte)0x53, (byte)0x5b, (byte)0x54, (byte)0x5b,
+        (byte)0x55, (byte)0x5b, (byte)0x56, (byte)0x5b,
+        (byte)0x57, (byte)0x5b, (byte)0x58, (byte)0x5b,
+        (byte)0x59, (byte)0x5b, (byte)0x5a, (byte)0x5b,
+        (byte)0x5b, (byte)0x5b, (byte)0x5c, (byte)0x5b,
+        (byte)0x5d, (byte)0x5b, (byte)0x5e, (byte)0x5b,
+        (byte)0x5f, (byte)0x5b, (byte)0x60, (byte)0x5b,
+        (byte)0x61, (byte)0x5b, (byte)0x62, (byte)0x5b,
+        (byte)0x63, (byte)0x5b, (byte)0x64, (byte)0x5b,
+        (byte)0x65, (byte)0x5b, (byte)0x66, (byte)0x5b,
+        (byte)0x67, (byte)0x5b, (byte)0x68, (byte)0x5b,
+        (byte)0x69, (byte)0x5b, (byte)0x6a, (byte)0x5b,
+        (byte)0x6b, (byte)0x5b, (byte)0x6c, (byte)0x5b,
+        (byte)0x6d, (byte)0x5b, (byte)0x6e, (byte)0x5b,
+        (byte)0x6f, (byte)0x5b, (byte)0x70, (byte)0x5b,
+        (byte)0x71, (byte)0x5b, (byte)0x72, (byte)0x5b,
+        (byte)0x73, (byte)0x5b, (byte)0x74, (byte)0x5b,
+        (byte)0x75, (byte)0x5b, (byte)0x76, (byte)0x5b,
+        (byte)0x77, (byte)0x5b, (byte)0x78, (byte)0x5b,
+        (byte)0x79, (byte)0x5b, (byte)0x7a, (byte)0x5b,
+        (byte)0x7b, (byte)0x5b, (byte)0x7c, (byte)0x5b,
+        (byte)0x7d, (byte)0x5b, (byte)0x7e, (byte)0x5c,
+        (byte)0x21, (byte)0x5c, (byte)0x22, (byte)0x5c,
+        (byte)0x23, (byte)0x5c, (byte)0x24, (byte)0x5c,
+        (byte)0x25, (byte)0x5c, (byte)0x26, (byte)0x5c,
+        (byte)0x27, (byte)0x5c, (byte)0x28, (byte)0x5c,
+        (byte)0x29, (byte)0x5c, (byte)0x2a, (byte)0x5c,
+        (byte)0x2b, (byte)0x5c, (byte)0x2c, (byte)0x5c,
+        (byte)0x2d, (byte)0x5c, (byte)0x2e, (byte)0x5c,
+        (byte)0x2f, (byte)0x5c, (byte)0x30, (byte)0x5c,
+        (byte)0x31, (byte)0x5c, (byte)0x32, (byte)0x5c,
+        (byte)0x33, (byte)0x5c, (byte)0x34, (byte)0x5c,
+        (byte)0x35, (byte)0x5c, (byte)0x36, (byte)0x5d,
+        (byte)0x79, (byte)0x5d, (byte)0x7a, (byte)0x5d,
+        (byte)0x7b, (byte)0x5d, (byte)0x7c, (byte)0x5d,
+        (byte)0x7d, (byte)0x5d, (byte)0x7e, (byte)0x5e,
+        (byte)0x21, (byte)0x5e, (byte)0x22, (byte)0x5e,
+        (byte)0x23, (byte)0x5e, (byte)0x24, (byte)0x5e,
+        (byte)0x25, (byte)0x5e, (byte)0x26, (byte)0x5e,
+        (byte)0x27, (byte)0x5e, (byte)0x28, (byte)0x5e,
+        (byte)0x29, (byte)0x5e, (byte)0x2a, (byte)0x5e,
+        (byte)0x2b, (byte)0x5e, (byte)0x2c, (byte)0x5e,
+        (byte)0x2d, (byte)0x5e, (byte)0x2e, (byte)0x5e,
+        (byte)0x2f, (byte)0x5e, (byte)0x30, (byte)0x5e,
+        (byte)0x31, (byte)0x5e, (byte)0x32, (byte)0x5e,
+        (byte)0x33, (byte)0x5e, (byte)0x34, (byte)0x5e,
+        (byte)0x35, (byte)0x5e, (byte)0x36, (byte)0x5e,
+        (byte)0x37, (byte)0x5e, (byte)0x38, (byte)0x5e,
+        (byte)0x39, (byte)0x5e, (byte)0x3a, (byte)0x5e,
+        (byte)0x3b, (byte)0x5e, (byte)0x3c, (byte)0x5e,
+        (byte)0x3d, (byte)0x5e, (byte)0x3e, (byte)0x5e,
+        (byte)0x3f, (byte)0x5e, (byte)0x40, (byte)0x5e,
+        (byte)0x41, (byte)0x5e, (byte)0x42, (byte)0x5e,
+        (byte)0x43, (byte)0x5e, (byte)0x44, (byte)0x5e,
+        (byte)0x45, (byte)0x5e, (byte)0x46, (byte)0x5e,
+        (byte)0x47, (byte)0x5e, (byte)0x48, (byte)0x5e,
+        (byte)0x49, (byte)0x5e, (byte)0x4a, (byte)0x60,
+        (byte)0x30, (byte)0x60, (byte)0x31, (byte)0x60,
+        (byte)0x32, (byte)0x60, (byte)0x33, (byte)0x60,
+        (byte)0x34, (byte)0x60, (byte)0x35, (byte)0x60,
+        (byte)0x36, (byte)0x60, (byte)0x37, (byte)0x60,
+        (byte)0x38, (byte)0x60, (byte)0x39, (byte)0x60,
+        (byte)0x3a, (byte)0x60, (byte)0x3b, (byte)0x60,
+        (byte)0x3c, (byte)0x60, (byte)0x3d, (byte)0x60,
+        (byte)0x3e, (byte)0x60, (byte)0x3f, (byte)0x73,
+        (byte)0x26, (byte)0x73, (byte)0x27, (byte)0x73,
+        (byte)0x28, (byte)0x73, (byte)0x29, (byte)0x73,
+        (byte)0x2a, (byte)0x73, (byte)0x2b, (byte)0x73,
+        (byte)0x2c, (byte)0x73, (byte)0x2d, (byte)0x73,
+        (byte)0x2e, (byte)0x73, (byte)0x2f, (byte)0x73,
+        (byte)0x30, (byte)0x73, (byte)0x31, (byte)0x73,
+        (byte)0x32, (byte)0x73, (byte)0x33, (byte)0x73,
+        (byte)0x34, (byte)0x73, (byte)0x35, (byte)0x73,
+        (byte)0x36, (byte)0x73, (byte)0x37, (byte)0x73,
+        (byte)0x38, (byte)0x73, (byte)0x39, (byte)0x73,
+        (byte)0x3a, (byte)0x73, (byte)0x3b, (byte)0x73,
+        (byte)0x3c, (byte)0x73, (byte)0x3d, (byte)0x73,
+        (byte)0x3e, (byte)0x73, (byte)0x3f, (byte)0x73,
+        (byte)0x40, (byte)0x73, (byte)0x41, (byte)0x73,
+        (byte)0x42, (byte)0x73, (byte)0x43, (byte)0x73,
+        (byte)0x44, (byte)0x73, (byte)0x45, (byte)0x73,
+        (byte)0x46, (byte)0x73, (byte)0x47, (byte)0x73,
+        (byte)0x48, (byte)0x73, (byte)0x49, (byte)0x73,
+        (byte)0x4a, (byte)0x73, (byte)0x4b, (byte)0x73,
+        (byte)0x4c, (byte)0x73, (byte)0x4d, (byte)0x73,
+        (byte)0x4e, (byte)0x73, (byte)0x4f, (byte)0x73,
+        (byte)0x50, (byte)0x73, (byte)0x51, (byte)0x73,
+        (byte)0x52, (byte)0x73, (byte)0x53, (byte)0x73,
+        (byte)0x54, (byte)0x73, (byte)0x55, (byte)0x73,
+        (byte)0x56, (byte)0x73, (byte)0x57, (byte)0x73,
+        (byte)0x58, (byte)0x73, (byte)0x59, (byte)0x73,
+        (byte)0x5a, (byte)0x73, (byte)0x5b, (byte)0x73,
+        (byte)0x5c, (byte)0x73, (byte)0x5d, (byte)0x73,
+        (byte)0x5e, (byte)0x73, (byte)0x5f, (byte)0x73,
+        (byte)0x60, (byte)0x73, (byte)0x61, (byte)0x73,
+        (byte)0x62, (byte)0x73, (byte)0x63, (byte)0x73,
+        (byte)0x64, (byte)0x73, (byte)0x65, (byte)0x73,
+        (byte)0x66, (byte)0x73, (byte)0x67, (byte)0x73,
+        (byte)0x68, (byte)0x73, (byte)0x69, (byte)0x73,
+        (byte)0x6a, (byte)0x73, (byte)0x6b, (byte)0x73,
+        (byte)0x6c, (byte)0x73, (byte)0x6d, (byte)0x73,
+        (byte)0x6e, (byte)0x73, (byte)0x6f, (byte)0x73,
+        (byte)0x70, (byte)0x73, (byte)0x71, (byte)0x73,
+        (byte)0x72, (byte)0x73, (byte)0x73, (byte)0x73,
+        (byte)0x74, (byte)0x73, (byte)0x75, (byte)0x73,
+        (byte)0x76, (byte)0x73, (byte)0x77, (byte)0x73,
+        (byte)0x78, (byte)0x73, (byte)0x79, (byte)0x73,
+        (byte)0x7a, (byte)0x73, (byte)0x7b, (byte)0x73,
+        (byte)0x7c, (byte)0x73, (byte)0x7d, (byte)0x73,
+        (byte)0x7e, (byte)0x74, (byte)0x21, (byte)0x74,
+        (byte)0x22, (byte)0x74, (byte)0x23, (byte)0x74,
+        (byte)0x24, (byte)0x74, (byte)0x25, (byte)0x74,
+        (byte)0x26
+    };
+
+    private static byte[] expectedBytes_JISX0201KATAKANA1 =
+    {
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x21, (byte)0x22, (byte)0x23, (byte)0x24,
+        (byte)0x25, (byte)0x26, (byte)0x27, (byte)0x28,
+        (byte)0x29, (byte)0x2a, (byte)0x2b, (byte)0x2c,
+        (byte)0x2d, (byte)0x2e, (byte)0x2f, (byte)0x30,
+        (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34,
+        (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38,
+        (byte)0x39, (byte)0x3a, (byte)0x3b, (byte)0x3c,
+        (byte)0x3d, (byte)0x3e, (byte)0x3f, (byte)0x40,
+        (byte)0x41, (byte)0x42, (byte)0x43, (byte)0x44,
+        (byte)0x45, (byte)0x46, (byte)0x47, (byte)0x48,
+        (byte)0x49, (byte)0x4a, (byte)0x4b, (byte)0x4c,
+        (byte)0x4d, (byte)0x4e, (byte)0x4f, (byte)0x50,
+        (byte)0x51, (byte)0x52, (byte)0x53, (byte)0x54,
+        (byte)0x55, (byte)0x56, (byte)0x57, (byte)0x58,
+        (byte)0x59, (byte)0x5a, (byte)0x5b, (byte)0x5c,
+        (byte)0x5d, (byte)0x5e, (byte)0x5f
+    };
+
+    private static byte[] expectedBytes_JISX0201KATAKANA2 =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x21, (byte)0x23, (byte)0x21, (byte)0x56,
+        (byte)0x21, (byte)0x57, (byte)0x21, (byte)0x22,
+        (byte)0x21, (byte)0x26, (byte)0x25, (byte)0x72,
+        (byte)0x25, (byte)0x21, (byte)0x25, (byte)0x23,
+        (byte)0x25, (byte)0x25, (byte)0x25, (byte)0x27,
+        (byte)0x25, (byte)0x29, (byte)0x25, (byte)0x63,
+        (byte)0x25, (byte)0x65, (byte)0x25, (byte)0x67,
+        (byte)0x25, (byte)0x43, (byte)0x21, (byte)0x3c,
+        (byte)0x25, (byte)0x22, (byte)0x25, (byte)0x24,
+        (byte)0x25, (byte)0x26, (byte)0x25, (byte)0x28,
+        (byte)0x25, (byte)0x2a, (byte)0x25, (byte)0x2b,
+        (byte)0x25, (byte)0x2d, (byte)0x25, (byte)0x2f,
+        (byte)0x25, (byte)0x31, (byte)0x25, (byte)0x33,
+        (byte)0x25, (byte)0x35, (byte)0x25, (byte)0x37,
+        (byte)0x25, (byte)0x39, (byte)0x25, (byte)0x3b,
+        (byte)0x25, (byte)0x3d, (byte)0x25, (byte)0x3f,
+        (byte)0x25, (byte)0x41, (byte)0x25, (byte)0x44,
+        (byte)0x25, (byte)0x46, (byte)0x25, (byte)0x48,
+        (byte)0x25, (byte)0x4a, (byte)0x25, (byte)0x4b,
+        (byte)0x25, (byte)0x4c, (byte)0x25, (byte)0x4d,
+        (byte)0x25, (byte)0x4e, (byte)0x25, (byte)0x4f,
+        (byte)0x25, (byte)0x52, (byte)0x25, (byte)0x55,
+        (byte)0x25, (byte)0x58, (byte)0x25, (byte)0x5b,
+        (byte)0x25, (byte)0x5e, (byte)0x25, (byte)0x5f,
+        (byte)0x25, (byte)0x60, (byte)0x25, (byte)0x61,
+        (byte)0x25, (byte)0x62, (byte)0x25, (byte)0x64,
+        (byte)0x25, (byte)0x66, (byte)0x25, (byte)0x68,
+        (byte)0x25, (byte)0x69, (byte)0x25, (byte)0x6a,
+        (byte)0x25, (byte)0x6b, (byte)0x25, (byte)0x6c,
+        (byte)0x25, (byte)0x6d, (byte)0x25, (byte)0x6f,
+        (byte)0x25, (byte)0x73, (byte)0x21, (byte)0x2b,
+        (byte)0x21, (byte)0x2c,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    private static byte[] expectedBytes_JISX0208NECROW13 =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x2d, (byte)0x21, (byte)0x2d, (byte)0x22,
+        (byte)0x2d, (byte)0x23, (byte)0x2d, (byte)0x24,
+        (byte)0x2d, (byte)0x25, (byte)0x2d, (byte)0x26,
+        (byte)0x2d, (byte)0x27, (byte)0x2d, (byte)0x28,
+        (byte)0x2d, (byte)0x29, (byte)0x2d, (byte)0x2a,
+        (byte)0x2d, (byte)0x2b, (byte)0x2d, (byte)0x2c,
+        (byte)0x2d, (byte)0x2d, (byte)0x2d, (byte)0x2e,
+        (byte)0x2d, (byte)0x2f, (byte)0x2d, (byte)0x30,
+        (byte)0x2d, (byte)0x31, (byte)0x2d, (byte)0x32,
+        (byte)0x2d, (byte)0x33, (byte)0x2d, (byte)0x34,
+        (byte)0x2d, (byte)0x35, (byte)0x2d, (byte)0x36,
+        (byte)0x2d, (byte)0x37, (byte)0x2d, (byte)0x38,
+        (byte)0x2d, (byte)0x39, (byte)0x2d, (byte)0x3a,
+        (byte)0x2d, (byte)0x3b, (byte)0x2d, (byte)0x3c,
+        (byte)0x2d, (byte)0x3d, (byte)0x2d, (byte)0x3e,
+        (byte)0x2d, (byte)0x40, (byte)0x2d, (byte)0x41,
+        (byte)0x2d, (byte)0x42, (byte)0x2d, (byte)0x43,
+        (byte)0x2d, (byte)0x44, (byte)0x2d, (byte)0x45,
+        (byte)0x2d, (byte)0x46, (byte)0x2d, (byte)0x47,
+        (byte)0x2d, (byte)0x48, (byte)0x2d, (byte)0x49,
+        (byte)0x2d, (byte)0x4a, (byte)0x2d, (byte)0x4b,
+        (byte)0x2d, (byte)0x4c, (byte)0x2d, (byte)0x4d,
+        (byte)0x2d, (byte)0x4e, (byte)0x2d, (byte)0x4f,
+        (byte)0x2d, (byte)0x50, (byte)0x2d, (byte)0x51,
+        (byte)0x2d, (byte)0x52, (byte)0x2d, (byte)0x53,
+        (byte)0x2d, (byte)0x54, (byte)0x2d, (byte)0x55,
+        (byte)0x2d, (byte)0x56, (byte)0x2d, (byte)0x5f,
+        (byte)0x2d, (byte)0x60, (byte)0x2d, (byte)0x61,
+        (byte)0x2d, (byte)0x62, (byte)0x2d, (byte)0x63,
+        (byte)0x2d, (byte)0x64, (byte)0x2d, (byte)0x65,
+        (byte)0x2d, (byte)0x66, (byte)0x2d, (byte)0x67,
+        (byte)0x2d, (byte)0x68, (byte)0x2d, (byte)0x69,
+        (byte)0x2d, (byte)0x6a, (byte)0x2d, (byte)0x6b,
+        (byte)0x2d, (byte)0x6c, (byte)0x2d, (byte)0x6d,
+        (byte)0x2d, (byte)0x6e, (byte)0x2d, (byte)0x6f,
+        (byte)0x2d, (byte)0x73, (byte)0x2d, (byte)0x74,
+        (byte)0x2d, (byte)0x78, (byte)0x2d, (byte)0x79,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+
+    private static String MIXEDCONTENT =
+        "JA\u3000\u3002\u0062\uFF64PAN" +
+        "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+        "\u30FB\uFF67\u203E";
+
+    static byte[] mixedBytesExpected = {
+        (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+        (byte)0x42, (byte)0x21, (byte)0x21, (byte)0x21,
+        (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x50, (byte)0x41, (byte)0x4e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+        (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+        (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+        (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+        (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+        (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+        (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42  };
+
+    private static byte[] repeatingEscapes = {
+        (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+        (byte)0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x21, (byte)0x21, (byte)0x21,
+        (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+        // embedded repeated iso-2022 escapes (see bugID 4879522)
+        (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x0f, (byte)0x0e, (byte)0x0f,
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x50, (byte)0x41, (byte)0x4e,
+        // embedded shift chars (see bugID 4879522)
+        (byte)0x0e, (byte)0x0f,
+        (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+        (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+        (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+        (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+        (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+        (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+        (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42  };
+
+    private static String JISX0212 =
+        "\u02d8\u6896\ue757";
+
+    private static byte[] expectedBytes_JISX0212 = {
+        (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+        (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+        (byte)0x7e, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing a substantial
+     * subset of MS5022X encodeable chars
+     */
+
+    private static void roundTrip(String name,
+                                  String testStr,
+                                  byte[] expectBytes)
+    throws Exception {
+        byte[] encodedBytes = testStr.getBytes(name);
+        if (encodedBytes.length != expectBytes.length) {
+            //System.out.printf("l1=%d, l2=%d\n",
+            //                  encodedBytes.length,expectBytes.length);
+            throw new Exception(name + " Encoder error");
+        }
+        for (int i = 0; i < expectBytes.length; i++) {
+
+            if (encodedBytes[i] != expectBytes[i])  {
+                //System.out.printf("--->");
+                //throw new Exception(name + " Encoder error");
+            }
+            //System.out.printf("%x, %x\n",
+            //encodedBytes[i],expectBytes[i]);
+        }
+        String decoded = new String(encodedBytes, name);
+        if (!decoded.equals(testStr)) {
+            throw new Exception(name + " Decoder error");
+        }
+        String decoded2 = new String(repeatingEscapes, name);
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception(name + " Decoder error");
+        }
+     }
+
+    public static void main(String[] args) throws Exception {
+        String map = System.getProperty("sun.nio.cs.map");
+        if (map != null) {
+            map = map.toLowerCase(java.util.Locale.US);
+            Charset cs = Charset.forName("ISO-2022-JP");
+            if (map.indexOf("x-windows-50221/ISO-2022-jp") != -1 &&
+                !"x-windows-50220".equals(cs.name()) ||
+                map.indexOf("x-windows-50220/ISO-2022-jp") != -1 &&
+                !"x-windows-50220".equals(cs.name()) ||
+                map.indexOf("x-windows-iso2022jp/ISO-2022-jp") != -1 &&
+                !"x-windows-iso2022jp".equals(cs.name())) {
+                throw new Exception("Error: sun.nio.cs.map=" + map +
+                                    ", ISO-2022-JP=" + cs.name());
+            } else {
+                System.out.printf("ISO-2022-JP=%s\n", cs.name());
+            }
+        }
+
+        String testStr = US_ASCII +
+                         JISX0208SUBSET +
+                         JISX0201KATAKANA +
+                         JISX0208NECROW13;
+
+        byte[] expectedBytes= (new String(expectedBytes_US_ASCII, "ASCII") +
+                               new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+                               new String(expectedBytes_JISX0201KATAKANA1, "ASCII") +
+                               new String(expectedBytes_JISX0208NECROW13, "ASCII")).
+          getBytes("ASCII");
+
+        //MS50221
+        roundTrip("MS50221", testStr, expectedBytes);
+        roundTrip("MS50221", JISX0212, expectedBytes_JISX0212);
+
+        //MS50220 without halfwidth kana
+        roundTrip("MS50220",
+                  US_ASCII + JISX0208SUBSET + JISX0208NECROW13,
+                  (new String(expectedBytes_US_ASCII, "ASCII") +
+                   new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+                   new String(expectedBytes_JISX0208NECROW13,
+                              3,
+                              expectedBytes_JISX0208NECROW13.length - 3,
+                              "ASCII")).getBytes("ASCII"));
+        roundTrip("MS50220", JISX0212, expectedBytes_JISX0212);
+
+        // Try MS50220 with halfwidth kana encoding
+        byte[] encodedBytes = JISX0201KATAKANA.getBytes("MS50220");
+        if (encodedBytes.length != expectedBytes_JISX0201KATAKANA2.length) {
+            throw new Exception("MS50220 Encoder error");
+        }
+        for (int i = 0; i < expectedBytes_JISX0201KATAKANA2.length; i++) {
+            if (encodedBytes[i] != expectedBytes_JISX0201KATAKANA2[i])  {
+                throw new Exception("MS50220 Encoder error");
+            }
+        }
+
+        //x-windows-iso2022jp
+        testStr = testStr.replace('\u301E', '\u301D')
+                         .replace('\u301C', '\uFF4E')
+                         .replace('\u2016', '\u2225');
+        roundTrip("x-windows-iso2022jp",
+                  testStr,
+                  expectedBytes);
+
+        testStr = MIXEDCONTENT;
+        roundTrip("MS50221", testStr , mixedBytesExpected);
+
+        // Test for bugID 4913711
+        // ISO-2022-JP encoding of a single input char yields
+        // 8 output bytes. Prior to fix for 4913711 the
+        // max bytes per char value was underspecified as 5.0
+        // and the code below would have thrown a BufferOverflow
+        // exception. This test validates the fix for 4913711
+
+        testStr = "\u3042";
+        byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+                            (byte)0x24, (byte)0x22, (byte)0x1b,
+                            (byte)0x28, (byte)0x42 };
+        byte[] encoded = testStr.getBytes("MS50221");
+        for (int i = 0; i < expected.length; i++) {
+            if (encoded[i] != expected[i])
+               throw new Exception("MS50221 Decoder error");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestMiscEUC_JP.java b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java
new file mode 100644
index 0000000..5611280
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4121376
+   @summary Verify that EUC_JP 0x8FA2B7 maps to \uFF5E
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestMiscEUC_JP {
+
+  public static void main(String[] args) throws Exception
+  {
+    Charset cs = Charset.forName("EUC_JP");
+    CharsetDecoder dec  = cs.newDecoder();
+    CharsetEncoder enc  = cs.newEncoder();
+    byte[] euc           = {(byte)0x8F, (byte)0xA2, (byte)0xB7};
+
+    CharBuffer cb = dec.decode(ByteBuffer.wrap(euc));
+    if (cb.charAt(0) != 0xFF5E) {
+      throw new Exception("Converted EUC_JP 0x8FA2B7 to: 0x"
+                          + Integer.toHexString((int)cb.charAt(0)));
+    }
+    ByteBuffer bb = enc.encode(cb);
+
+    if (!((bb.limit() == 3)
+          && (bb.get() == euc[0])
+          && (bb.get() == euc[1])
+          && (bb.get() == euc[2]))) {
+      cb.flip();
+      bb.flip();
+      throw new Exception("Roundrip failed for char 0x"
+                          + Integer.toHexString((int)cb.charAt(0)) + ": "
+                          + Integer.toHexString(bb.limit()) + " 0x"
+                          + Integer.toHexString((int)bb.get() & 0xff) + " "
+                          + Integer.toHexString((int)bb.get() & 0xff) + " "
+                          + Integer.toHexString((int)bb.get() & 0xff));
+    }
+  }
+}
diff --git a/jdk/test/sun/nio/cs/TestSJIS0213.java b/jdk/test/sun/nio/cs/TestSJIS0213.java
new file mode 100644
index 0000000..db27ac0
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestSJIS0213.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 6529796 6710199
+   @summary Test SJIS/MS932_0213 charsets
+ */
+
+import java.util.Arrays;
+
+public class TestSJIS0213 {
+    private static String sjisStr = "\u2014\u301C\u2016\u2212\u00A2\u00A3\u00AC";
+    private static String winStr = "\u2015\uFF5E\u2225\uFF0D\uFFE0\uFFE1\uFFE2\u2252\u2261\u222B\u2211\u221A\u22A5\u2220\u2235\u2229\u222A";
+
+    private static String compStr = "\u304B\u309A\u304D\u309A\u304F\u309A\u3051\u309A\u3053\u309A\u30AB\u309A\u30AD\u309A\u30AF\u309A\u30B1\u309A\u30B3\u309A\u30BB\u309A\u30C4\u309A\u30C8\u309A\u31F7\u309A\u00E6\u0300\u0254\u0300\u0254\u0301\u028C\u0300\u028C\u0301\u0259\u0300\u0259\u0301\u025A\u0300\u025A\u0301\u02E9\u02E5\u02E5\u02E9";
+    private static byte[] compBytes = new byte[] {
+        (byte)0x82, (byte)0xf5,
+        (byte)0x82, (byte)0xf6,
+        (byte)0x82, (byte)0xf7,
+        (byte)0x82, (byte)0xf8,
+        (byte)0x82, (byte)0xf9,
+        (byte)0x83, (byte)0x97,
+        (byte)0x83, (byte)0x98,
+        (byte)0x83, (byte)0x99,
+        (byte)0x83, (byte)0x9a,
+        (byte)0x83, (byte)0x9b,
+        (byte)0x83, (byte)0x9c,
+        (byte)0x83, (byte)0x9d,
+        (byte)0x83, (byte)0x9e,
+        (byte)0x83, (byte)0xf6,
+        (byte)0x86, (byte)0x63,
+        (byte)0x86, (byte)0x67,
+        (byte)0x86, (byte)0x68,
+        (byte)0x86, (byte)0x69,
+        (byte)0x86, (byte)0x6a,
+        (byte)0x86, (byte)0x6b,
+        (byte)0x86, (byte)0x6c,
+        (byte)0x86, (byte)0x6d,
+        (byte)0x86, (byte)0x6e,
+        (byte)0x86, (byte)0x85,
+        (byte)0x86, (byte)0x86 };
+
+    private static String mixedStr = "\u002B\u0041\u007a\uff61\uff9f\u3000\u30a1\u4e00\u304B\u309A\u304b";
+    private static byte[] mixedBytes = new byte[] {
+         (byte)0x2b,
+         (byte)0x41, (byte)0x7a,
+         (byte)0xa1, (byte)0xdf,
+         (byte)0x81, (byte)0x40,
+         (byte)0x83, (byte)0x40,
+         (byte)0x88, (byte)0xea,
+         (byte)0x82, (byte)0xf5,   // composite
+         (byte)0x82, (byte)0xa9 }; // base without cc
+
+    //base + base + cc
+    private static String mixedCompStr = "\u304D\u304B\u309A";
+    private static byte[] mixedCompBytes = new byte[] {
+        (byte)0x82, (byte)0xab, (byte)0x82, (byte)0xf5};
+
+    private static char[] unmappableChars = new char[] {
+        0x80, 0xfffc, 0xfffd};
+
+    private static byte[] unmappableBytes = new byte[] {
+        0x3f, 0x3f, 0x3f};
+
+    public static void main(String[] args) throws Exception {
+        if (!winStr.equals(new String(winStr.getBytes("MS932"), "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on special codepoints!");
+
+        if (!(Arrays.equals(compStr.getBytes("MS932_0213"), compBytes)) ||
+            !compStr.equals(new String(compBytes, "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on composites!");
+
+        if (!(Arrays.equals(mixedStr.getBytes("MS932_0213"), mixedBytes)) ||
+            !mixedStr.equals(new String(mixedBytes, "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on mixed!");
+
+        if (!sjisStr.equals(new String(sjisStr.getBytes("SJIS"), "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on special codepoints!");
+
+        if (!(Arrays.equals(compStr.getBytes("SJIS_0213"), compBytes)) ||
+            !compStr.equals(new String(compBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on composites!");
+
+        if (!(Arrays.equals(mixedStr.getBytes("SJIS_0213"), mixedBytes)) ||
+            !mixedStr.equals(new String(mixedBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on mixed!");
+
+        if (!(Arrays.equals(mixedCompStr.getBytes("SJIS_0213"), mixedCompBytes)) ||
+            !mixedCompStr.equals(new String(mixedCompBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on mixedComp!");
+
+        if (!Arrays.equals(new String(unmappableChars).getBytes("SJIS_0213"), unmappableBytes) ||
+            !Arrays.equals(new String(unmappableChars).getBytes("MS932_0213"), unmappableBytes))
+            throw new RuntimeException("SJIS/MS932_0213 failed on unmappable encoding!");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java
new file mode 100644
index 0000000..f83f75f
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4697605 4741233
+   @summary Check decoder behaves correctly in ISO2022_JP
+ */
+
+import java.io.*;
+
+public class TestTrailingEscapesISO2022JP {
+
+    public static void main(String[] args) throws Exception {
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int len;
+
+        InputStream in =
+            new FileInputStream(new File(System.getProperty("test.src", "."),
+                                        "ISO2022JP.trailEsc"));
+        try {
+            byte[] b = new byte[4096];
+            while ( ( len = in.read( b, 0, b.length ) ) != -1 ) {
+                out.write(b, 0, len);
+            }
+        } finally {
+            in.close();
+        }
+
+        Reader inR = new InputStreamReader(new ByteArrayInputStream(
+                                                        out.toByteArray()),
+                                                       "iso-2022-jp");
+
+        try {
+            char[] c = new char[4096];
+            while ( ( len = inR.read( c, 0, c.length ) ) != -1 ) {
+                System.out.println(len);
+                if (len == 0)
+                    throw new Exception("Read returned zero!");
+            }
+        } finally {
+            inR.close();
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestUTF8BOM.java b/jdk/test/sun/nio/cs/TestUTF8BOM.java
new file mode 100644
index 0000000..dd40c53
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestUTF8BOM.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4508058 6378911
+   @summary Check if UTF8 decoder handles BOM correctly
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+/* The fix for 6378911 is to backout the change we made for 4508058,
+   so this regtest is modified accordingly to leave the beginning
+   BOM untouched during decoding.
+ */
+public class TestUTF8BOM {
+    private static ByteBuffer bf = ByteBuffer.allocateDirect(1000);
+    private static void testDecode(String expected, byte[] input)
+        throws Exception
+    {
+        String out = new String(input, "utf8");
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_8 Decoding test failed");
+        }
+
+        //try directBuffer.
+        bf.clear();
+        bf.put(input).flip();
+        out = Charset.forName("UTF-8")
+                     .decode(bf)
+                     .toString();
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_8 Decoding test failed(directbuffer)");
+        }
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            System.out.println("expected char[" + i + "] : " +
+                              Integer.toHexString((int)expected.charAt(i)) +
+                              "  obtained char[" + i + "] : " +
+                              Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    public static void main (String[] args) throws Exception {
+            // Test 1: with BOM at beginning
+            testDecode("\ufeff\u0092\u0093",
+                        new byte[] { (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+                                     (byte) 0xc2, (byte) 0x92,
+                                     (byte) 0xc2, (byte) 0x93 });
+            // Test 2: with BOM at middle
+            testDecode("\u9200\ufeff\u9300",
+                        new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+                                     (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+                                     (byte) 0xe9, (byte) 0x8c, (byte) 0x80 });
+
+            // Test 3: with BOM at end
+            testDecode("\u9200\u9300\ufeff",
+                        new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+                                     (byte) 0xe9, (byte) 0x8c, (byte) 0x80,
+                                     (byte) 0xef, (byte) 0xbb, (byte) 0xbf });
+            System.err.println ("\nPASSED UTF-8 decode BOM test");
+   }
+}
diff --git a/jdk/test/sun/nio/cs/TestUTF_16.java b/jdk/test/sun/nio/cs/TestUTF_16.java
new file mode 100644
index 0000000..3e1b91a
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestUTF_16.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4403848 6348426 6407730
+   @summary Check correctness of the UTF-16 converter in all its flavors
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_16 {
+
+    private static void testDecode(String charset,
+                                   String expected,
+                                   byte[] input)
+    throws Exception
+    {
+        String out = new String(input, charset);
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_16 Decoding test failed " + charset);
+        }
+    }
+
+    private static void testEncode(String charset,
+                                   String input,
+                                   byte[] expected)
+    throws Exception
+    {
+        byte[] testBytes = input.getBytes(charset);
+        for (int i = 0; i< expected.length; i++)
+            if (testBytes[i] != expected[i])
+                throw new Exception("UTF_16 Encoding test failed " + charset);
+
+    }
+
+    private static void warn(String s) {
+        System.err.println("FAILED Test 4403848 UTF-16" +
+                            s) ;
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            warn("expected char[" + i + "] : " +
+                  Integer.toHexString((int)expected.charAt(i)) +
+                 "obtained char[" + i + "] : " +
+                  Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    /*
+    private static void checkResult(char[] expected,
+                                    String testStr,
+                                    String testName)
+    throws Exception
+    {
+        if (testStr.length() != expected.length)
+            failureReport(testStr, expected);
+
+        for (int i = 0; i < testStr.length(); i++) {
+            if (testStr.charAt(i) != expected[i]) {
+                failureReport(testStr, expected);
+                throw new Exception ("REGTEST TestUTF16 failed: "
+                                        + testName);
+            }
+        }
+        System.err.println ("Test " + testName + " PASSED");
+        return;
+    }
+    */
+
+    private static void test() throws Exception  {
+
+            // Tests: Check decoding of UTF-16.
+            //        Ensures correct endian polarity
+            //        of the decoders and appropriate
+            //        interpretation of BOM bytes where
+            //        they are required.
+
+            // Test 1: BigEndian UTF-16 Decoding
+
+            testDecode("UTF_16BE", "\u0092\u0093",
+                        new byte[] { (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 1a: BigEndian UTF-16 Decoding. BOM bytes provided.
+            testDecode("UTF_16BE", "\ufeff\u0092\u0093",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            testDecode("UTF_16LE", "\u9200\u9300",
+                        new byte[] { (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 2a: LittleEndian  UTF-16 Decoding, BOM bytes provided.
+            testDecode("UTF_16LE", "\ufeff\u9200\u9300",
+                        new byte[] { (byte) 0xff, (byte) 0xfe,
+                                     (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 3: UTF-16 (with mandatory byte order mark) Decoding
+
+            testDecode("UTF-16", "\u9200\u9300",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x92, (byte) 0x00,
+                                     (byte) 0x93, (byte) 0x00 });
+
+
+            // Test 3a: UTF-16 BOM omitted. This should decode OK.
+            testDecode("UTF-16", "\u9200\u9300",
+                        new byte[] { (byte) 0x92, (byte) 0x00,
+                                     (byte) 0x93, (byte) 0x00 });
+
+
+            // Test 4: encoding using UTF-16
+            // BOM must be emitted when encoding and must be BigEndian.
+
+            testEncode("UTF-16", "\u0123",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x01, (byte) 0x23 });
+
+            // Test 5:
+            if (CoderResult.OVERFLOW !=
+                Charset.forName("UTF_16")
+                .newDecoder()
+                .decode((ByteBuffer)(ByteBuffer.allocate(4)
+                                     .put(new byte[]
+                                          {(byte)0xd8,(byte)0x00,
+                                           (byte)0xdc,(byte)0x01})
+                                     .flip()),
+                        CharBuffer.allocate(1),
+                        true)) {
+                throw new Exception ("REGTEST TestUTF16 Overflow test failed");
+            }
+
+            // Test 6: decoding using UTF_16LE_BOM/UnicodeLittle
+            // UnicodeLittle should accept non-BOM byte sequence
+
+            testDecode("UnicodeLittle", "Arial",
+                        new byte[] { 'A', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0});
+
+            System.err.println ("\nPASSED UTF-16 encoder test");
+
+        // Reversed BOM in middle of stream Negative test.
+
+        /*
+        boolean caughtException = false;
+        try {
+                String out = new String(new byte[] {(byte)0x00,
+                                            (byte)0x92,
+                                            (byte)0xff,
+                                            (byte)0xfe},
+                                            "UTF-16");
+        } catch (IOException e) { caughtException = true; }
+
+        if (caughtException == false)
+           throw new Exception ("Incorrectly parsed BOM in middle of input");
+        */
+
+            // Fixed included with bug 4403848 fixes buffer sizing
+            // issue due to non provision of additional 2 bytes
+            // headroom for initial BOM bytes for UTF-16 encoding.
+          System.err.println ("OVERALL PASS OF UTF-16 Test");
+   }
+
+   public static void main (String[] args) throws Exception {
+     test();
+   }
+}
diff --git a/jdk/test/sun/nio/cs/TestUTF_32.java b/jdk/test/sun/nio/cs/TestUTF_32.java
new file mode 100644
index 0000000..a9ccf06
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestUTF_32.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+   @bug 6346419
+   @summary Check correctness of the UTF-32 and its variant charsets
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_32 {
+    private static void testDecode(String charset,
+                                   String expected,
+                                   byte[] input)
+        throws Exception
+    {
+        String out = new String(input, charset);
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_32 Decoding test failed: " + charset);
+        }
+    }
+
+    private static void testEncode(String charset,
+                                   String input,
+                                   byte[] expected)
+        throws Exception
+    {
+        byte[] testBytes = input.getBytes(charset);
+        for (int i = 0; i< expected.length; i++)
+            if (testBytes[i] != expected[i])
+                throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset);
+
+    }
+
+    private static void warn(String s) {
+        System.err.println("FAILED Test UTF-32:" +
+                            s) ;
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            warn("expected char[" + i + "] : " +
+                  Integer.toHexString((int)expected.charAt(i)) +
+                 "obtained char[" + i + "] : " +
+                  Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    private static void writeInt(OutputStream os, int i, boolean isBig)
+        throws Exception
+    {
+        if (isBig) {
+            os.write((i>>24) & 0xff);
+            os.write((i>>16) & 0xff);
+            os.write((i>>8) & 0xff);
+            os.write(i & 0xff);
+        } else {
+            os.write(i & 0xff);
+            os.write((i>>8) & 0xff);
+            os.write((i>>16) & 0xff);
+            os.write((i>>24) & 0xff);
+        }
+    }
+
+    private static byte[] getBytes(boolean doBOM, boolean isBig)
+        throws Exception
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024);
+        if (doBOM)
+           writeInt(baos, 0xfeff, isBig);
+
+        for (int i = 0; i < 0xffff; i++) {
+            if (i < Character.MIN_SURROGATE ||
+                i > Character.MAX_SURROGATE)
+            writeInt(baos, i, isBig);
+        }
+        for (int i = 0x10000; i < 0x1ffff; i++) {
+            writeInt(baos, i, isBig);
+        }
+
+        for (int i = 0x100000; i < 0x10ffff; i++) {
+            writeInt(baos, i, isBig);
+        }
+        byte[] bb = baos.toByteArray();
+        baos.close();
+        return bb;
+    }
+
+    public static void main (String[] args) throws Exception {
+        byte[] bb;
+        String s;
+
+        // Test 1: UTF_32 BigEndian
+        bb = getBytes(false, true);
+        s = new String(bb, "UTF-32");
+        testDecode("UTF_32", s, bb);
+        testEncode("UTF_32", s, bb);
+
+        // Test 2: UTF_32 LittleEndian Decoding With BOM and
+        //         BigEndian Encoding
+        bb = getBytes(true, false);
+        s = new String(bb, "UTF-32");
+        bb = getBytes(false, true);
+        testDecode("UTF_32", s, bb);
+        testEncode("UTF_32", s, bb);
+
+
+        // Test 3: UTF_32BE
+        bb = getBytes(false, true);
+        s = new String(bb, "UTF-32BE");
+        testDecode("UTF_32BE", s, bb);
+        testEncode("UTF_32BE", s, bb);
+
+
+        // Test 4: UTF_32LE
+        bb = getBytes(false, false);
+        s = new String(bb, "UTF-32LE");
+        testDecode("UTF_32LE", s, bb);
+        testEncode("UTF_32LE", s, bb);
+
+        // Test 5: UTF_32BE_BOM
+        bb = getBytes(true, true);
+        s = new String(bb, "UTF-32BE-BOM");
+        testDecode("UTF_32BE_BOM", s, bb);
+        testEncode("UTF_32BE_BOM", s, bb);
+
+
+        // Test 6: UTF_32LE_BOM
+        bb = getBytes(true, false);
+        s = new String(bb, "UTF-32LE-BOM");
+        testDecode("UTF_32LE_BOM", s, bb);
+        testEncode("UTF_32LE_BOM", s, bb);
+
+        s = "\u4e00\ufffd\u4e01";
+        // Test 7: BigEndian with reverse BOM in middle
+        bb = new byte[] {
+            (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00,
+            (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01
+        };
+        if (!s.equals(new String(bb, "UTF_32")) ||
+            !s.equals(new String(bb, "UTF_32BE")) ||
+            !s.equals(new String(bb, "UTF_32BE_BOM")))
+            throw new Exception("UTF_32 Decoding test failed: ");
+
+        // Test 7: LittleEndian with reverse BOM in middle
+        bb = new byte[] {
+            (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff,
+            (byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00
+        };
+        if (!s.equals(new String(bb, "UTF_32")) ||
+            !s.equals(new String(bb, "UTF_32LE")) ||
+            !s.equals(new String(bb, "UTF_32LE_BOM")))
+            throw new Exception("UTF_32 Decoding test failed: ");
+
+        // Test 8: Overflow
+        if (CoderResult.OVERFLOW !=
+            Charset.forName("UTF_32")
+            .newDecoder()
+            .decode((ByteBuffer)(ByteBuffer.allocate(4)
+                                 .put(new byte[]
+                                      {(byte)0,(byte)1, (byte)0,(byte)01})
+                                 .flip()),
+                    CharBuffer.allocate(1),
+                    true)) {
+            throw new Exception ("Test UTF-32 Overflow test failed");
+        }
+        System.err.println ("OVERALL PASS OF UTF-32 Test");
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestUni2HKSCS.java b/jdk/test/sun/nio/cs/TestUni2HKSCS.java
new file mode 100644
index 0000000..08a8a13
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestUni2HKSCS.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4634811
+   @summary Check Unicode 2.1 --> Big5-HKSCS reverse compatible mappings
+ */
+
+/*
+ * Mappings sourced from www.info.gov.hk/digital21/eng/hkscs
+ */
+
+public class TestUni2HKSCS {
+    private static final String uni21String =
+        "\uF3F5\uF3F8\uF3FD\uF403\uF413\uF415\uF418\uF419\uF41A"+
+        "\uF424\uF426\uF428\uF42B\uF42C\uF42D\uF437\uF439"+
+        "\uF43A\uF43C\uF445\uF44A\uF44E\uF44F\uF464\uF468"+
+        "\uF46A\uF46B\uF473\uF47A\uF487\uF489\uF493\uF494"+
+        "\uF496\uF49D\uF4A2\uF4AB\uF4AC\uF4AE\uF4B5\uF4C6"+
+        "\uF4CB\uF4D6\uF4E1\uF4FA\uF502\uF504\uF51E\uF529"+
+        "\uF52D\uF52E\uF530\uF536\uF540\uF544\uF554\uF637"+
+        "\uF638\uF63B\uF63C\uF641\uF642\uF643\uF644\uF648"+
+        "\uF64C\uF651\uF653\uF658\uF65D\uF65F\uF662\uF664"+
+        "\uF666\uF669\uF66C\uF66D\uF66E\uF675\uF677\uF67C"+
+        "\uF67E\uF688\uF68D\uF69D\uF6A1\uF6A2\uF6A5\uF6A7"+
+        "\uF6AE\uF6AF\uE316\uE326\uE32A\uE33C\uE351\uE35E"+
+        "\uE368\uE376\uE378\uE387\uE39C\uE3AD\uE3B3\uE3BE"+
+        "\uE3C2\uE3C7\uE3CB\uE3D1\uE3D2\uE3DE\uE3E2\uE3E4"+
+        "\uE3E8\uE3EA\uE3F5\uE3F7\uE406\uE40E\uE427\uE437"+
+        "\uE43D\uE449\uE44F\uE460\uE46B\uE47A\uE493\uE4A0"+
+        "\uE4A5\uE4A9\uE4B2\uE4BE\uE4BF\uE4C0\uE4DE\uE4E3"+
+        "\uE4E5\uE4ED\uE4F7\uE500\uE507\uE50E\uE534\uE539"+
+        "\uE53A\uE53B\uE53D\uE541\uE553\uE569\uE574\uE578"+
+        "\uE57B\uE57F\uE591\uE596\uE597\uE598\uE59C\uE5AE"+
+        "\uE5B9\uE5BC\uE5E0\uE5EC\uE5F5\uE5FA\uE5FE\uE60C"+
+        "\uE61D\uE629\uE62D\uE639\uE63B\uE63D\uE651\uE664"+
+        "\uE675\uE681\uE682\uE68D\uE694\uE69D\uE6A0\uE6A4"+
+        "\uE6A9\uE6AB\uE6B6\uE6C8\uE6E2\uE6E3\uE6E8\uE6ED"+
+        "\uE6EF\uE6F1\uE6F4\uE6F8\uE6FD\uE6FE\uE700\uE712"+
+        "\uE716\uE719\uE726\uE72E\uE730\uE738\uE73A\uE73B"+
+        "\uE749\uE74C\uE760\uE776\uE77E\uE780\uE78F\uE7AA"+
+        "\uE7AC\uE7AD\uE7AE\uE7C0\uE7C1\uE7C7\uE7CB\uE7D0"+
+        "\uE7D5\uE7D9\uE7E6\uE7EA\uE7F0\uE7F6\uE7FA\uE806"+
+        "\uE815\uE81B\uE81D\uE822\uE824\uE82E\uE831\uE832"+
+        "\uE83D\uE83F\uE850\uE853\uE85F\uE86B\uE86D\uE876"+
+        "\uE880\uE88E\uE899\uE89B\uE89C\uE8B3\uE8B7\uE8BC"+
+        "\uE8D2\uE8E2\uE8E4\uE8EC\uE8EE\uE8F4\uE8F6\uE8F7"+
+        "\uE8F9\uE8FA\uE8FD\uE901\uE906\uE90B\uE90E\uE90F"+
+        "\uE910\uE911\uE912\uE915\uE91B\uE931\uE932\uE946"+
+        "\uE949\uE965\uE96C\uE979\uE98D\uE994\uE996\uE99C"+
+        "\uE99D\uE99E\uE99F\uE9A1\uE9A2\uE9A7\uE9AA\uE9AC"+
+        "\uE9AE\uE9B5\uE9B7\uE9B9\uE9BA\uE9BC\uE9BD\uE9C5"+
+        "\uE9CF\uE9D0\uE9D6\uE9D8\uE9DB\uE9DE\uE9E5\uE9E6"+
+        "\uE9E9\uE9EB\uE9F7\uE9FE\uEA03\uEA0A\uEA0B\uEA0F"+
+        "\uEA13\uEA15\uEA1B\uEA21\uEA2A\uEA31\uEA35\uEA3C"+
+        "\uEA3D\uEA4C\uEA4F\uEA57\uEA63\uEA66\uEA75\uEA76"+
+        "\uEA7D\uEA82\uEA85\uEA87\uEA89\uEA8D\uEA90\uEA9B"+
+        "\uEA9D\uEAA6\uEAA8\uEAC8\uEAF7\uEB17\uEB51\uEB52"+
+        "\uEB60\uEB66\uEB6A\uEB87\uEB8B\uEB92\uEB96\uEBB1"+
+        "\uEBC3\uEBD6\uEBE0\uEBE6\uEBEA\uEBFF\uEC00\uEC03"+
+        "\uEC0B\uEC0D\uEC16\uEC3D\uEC4A\uEC4D\uEC53\uEC55"+
+        "\uEC61\uEC77\uEC7C\uEC7F\uEC87\uEC8C\uEC8F\uEC97"+
+        "\uECAE\uECB0\uECD0\uECD5\uECF4\uED05\uED1B\uED1F"+
+        "\uED23\uED33\uED37\uED38\uED3A\uED44\uED48\uED4C"+
+        "\uED59\uED5C\uED5D\uED5E\uED64\uED66\uED6D\uED6F"+
+        "\uED7B\uEDAE\uEDC1\uEDF3\uEDF5\uEE2E\uEE43\uEE45"+
+        "\uEE4A\uEE53\uEE59\uEE65\uEE89\uEE93\uEE97\uEE9F"+
+        "\uEEB2\uF6DD\uF820\uF821\uF822\uF823\uF824\uF825"+
+        "\uF826\uF827\uF828\uF829\uF82A\uF82B\uF82C\uF82D"+
+        "\uF82E\uF82F\uF830\uF831\uF832\uF833\uF834\uF835"+
+        "\uF836\uF837\uF838\uF839\uF83A\uF83B\uE005\uE008"+
+        "\uE028\uE02B\uE043\uE06A\uE06B\uE06E\uE07E\uE086"+
+        "\uE098\uE09B\uE0A0\uE0A8\uE0BB\uE0C2\uE0CD\uE0D7"+
+        "\uE0DA\uE0F1\uE0F4\uE0FA\uE0FC\uE104\uE105\uE10E"+
+        "\uE117\uE125\uE12A\uE12B\uE13C\uE143\uE144\uE153"+
+        "\uE15E\uE15F\uE160\uE164\uE17E\uE18C\uE19A\uE19C"+
+        "\uE1A7\uE1A9\uE1C6\uE1CF\uE1E0\uE1E1\uE1E3\uE1E7"+
+        "\uE1EA\uE1F4\uE1F8\uE203\uE211\uE217\uE218\uE239"+
+        "\uE23F\uE243\uE246\uE25D\uE25E\uE281\uE28A\uE298"+
+        "\uE2A2\uE2AC\uE2B1\uE2C8\uE2D7\uE30D";
+
+    private static final byte[] expectedBytes =
+        {(byte)0x89,(byte)0xb7,(byte)0x89,(byte)0xba,(byte)0x89,
+        (byte)0xbf,(byte)0x89,(byte)0xc5,(byte)0x89,(byte)0xd5,
+        (byte)0x89,(byte)0xd7,(byte)0x89,(byte)0xda,(byte)0x89,
+        (byte)0xdb,(byte)0x89,(byte)0xdc,(byte)0x89,(byte)0xe6,
+        (byte)0x89,(byte)0xe8,(byte)0x89,(byte)0xea,(byte)0x89,
+        (byte)0xed,(byte)0x89,(byte)0xee,(byte)0x89,(byte)0xef,
+        (byte)0x89,(byte)0xf9,(byte)0x89,(byte)0xfb,(byte)0x89,
+        (byte)0xfc,(byte)0x89,(byte)0xfe,(byte)0x8a,(byte)0x48,
+        (byte)0x8a,(byte)0x4d,(byte)0x8a,(byte)0x51,(byte)0x8a,
+        (byte)0x52,(byte)0x8a,(byte)0x67,(byte)0x8a,(byte)0x6b,
+        (byte)0x8a,(byte)0x6d,(byte)0x8a,(byte)0x6e,(byte)0x8a,
+        (byte)0x76,(byte)0x8a,(byte)0x7d,(byte)0x8a,(byte)0xac,
+        (byte)0x8a,(byte)0xae,(byte)0x8a,(byte)0xb8,(byte)0x8a,
+        (byte)0xb9,(byte)0x8a,(byte)0xbb,(byte)0x8a,(byte)0xc2,
+        (byte)0x8a,(byte)0xc7,(byte)0x8a,(byte)0xd0,(byte)0x8a,
+        (byte)0xd1,(byte)0x8a,(byte)0xd3,(byte)0x8a,(byte)0xda,
+        (byte)0x8a,(byte)0xeb,(byte)0x8a,(byte)0xf0,(byte)0x8a,
+        (byte)0xfb,(byte)0x8b,(byte)0x47,(byte)0x8b,(byte)0x60,
+        (byte)0x8b,(byte)0x68,(byte)0x8b,(byte)0x6a,(byte)0x8b,
+        (byte)0xa6,(byte)0x8b,(byte)0xb1,(byte)0x8b,(byte)0xb5,
+        (byte)0x8b,(byte)0xb6,(byte)0x8b,(byte)0xb8,(byte)0x8b,
+        (byte)0xbe,(byte)0x8b,(byte)0xc8,(byte)0x8b,(byte)0xcc,
+        (byte)0x8b,(byte)0xdc,(byte)0x8d,(byte)0x63,(byte)0x8d,
+        (byte)0x64,(byte)0x8d,(byte)0x67,(byte)0x8d,(byte)0x68,
+        (byte)0x8d,(byte)0x6d,(byte)0x8d,(byte)0x6e,(byte)0x8d,
+        (byte)0x6f,(byte)0x8d,(byte)0x70,(byte)0x8d,(byte)0x74,
+        (byte)0x8d,(byte)0x78,(byte)0x8d,(byte)0x7d,(byte)0x8d,
+        (byte)0xa1,(byte)0x8d,(byte)0xa6,(byte)0x8d,(byte)0xab,
+        (byte)0x8d,(byte)0xad,(byte)0x8d,(byte)0xb0,(byte)0x8d,
+        (byte)0xb2,(byte)0x8d,(byte)0xb4,(byte)0x8d,(byte)0xb7,
+        (byte)0x8d,(byte)0xba,(byte)0x8d,(byte)0xbb,(byte)0x8d,
+        (byte)0xbc,(byte)0x8d,(byte)0xc3,(byte)0x8d,(byte)0xc5,
+        (byte)0x8d,(byte)0xca,(byte)0x8d,(byte)0xcc,(byte)0x8d,
+        (byte)0xd6,(byte)0x8d,(byte)0xdb,(byte)0x8d,(byte)0xeb,
+        (byte)0x8d,(byte)0xef,(byte)0x8d,(byte)0xf0,(byte)0x8d,
+        (byte)0xf3,(byte)0x8d,(byte)0xf5,(byte)0x8d,(byte)0xfc,
+        (byte)0x8d,(byte)0xfd,(byte)0x8e,(byte)0x45,(byte)0x8e,
+        (byte)0x55,(byte)0x8e,(byte)0x59,(byte)0x8e,(byte)0x6b,
+        (byte)0x8e,(byte)0xa2,(byte)0x8e,(byte)0xaf,(byte)0x8e,
+        (byte)0xb9,(byte)0x8e,(byte)0xc7,(byte)0x8e,(byte)0xc9,
+        (byte)0x8e,(byte)0xd8,(byte)0x8e,(byte)0xed,(byte)0x8e,
+        (byte)0xfe,(byte)0x8f,(byte)0x45,(byte)0x8f,(byte)0x50,
+        (byte)0x8f,(byte)0x54,(byte)0x8f,(byte)0x59,(byte)0x8f,
+        (byte)0x5d,(byte)0x8f,(byte)0x63,(byte)0x8f,(byte)0x64,
+        (byte)0x8f,(byte)0x70,(byte)0x8f,(byte)0x74,(byte)0x8f,
+        (byte)0x76,(byte)0x8f,(byte)0x7a,(byte)0x8f,(byte)0x7c,
+        (byte)0x8f,(byte)0xa9,(byte)0x8f,(byte)0xab,(byte)0x8f,
+        (byte)0xba,(byte)0x8f,(byte)0xc2,(byte)0x8f,(byte)0xdb,
+        (byte)0x8f,(byte)0xeb,(byte)0x8f,(byte)0xf1,(byte)0x8f,
+        (byte)0xfd,(byte)0x90,(byte)0x44,(byte)0x90,(byte)0x55,
+        (byte)0x90,(byte)0x60,(byte)0x90,(byte)0x6f,(byte)0x90,
+        (byte)0xaa,(byte)0x90,(byte)0xb7,(byte)0x90,(byte)0xbc,
+        (byte)0x90,(byte)0xc0,(byte)0x90,(byte)0xc9,(byte)0x90,
+        (byte)0xd5,(byte)0x90,(byte)0xd6,(byte)0x90,(byte)0xd7,
+        (byte)0x90,(byte)0xf5,(byte)0x90,(byte)0xfa,(byte)0x90,
+        (byte)0xfc,(byte)0x91,(byte)0x45,(byte)0x91,(byte)0x4f,
+        (byte)0x91,(byte)0x58,(byte)0x91,(byte)0x5f,(byte)0x91,
+        (byte)0x66,(byte)0x91,(byte)0xae,(byte)0x91,(byte)0xb3,
+        (byte)0x91,(byte)0xb4,(byte)0x91,(byte)0xb5,(byte)0x91,
+        (byte)0xb7,(byte)0x91,(byte)0xbb,(byte)0x91,(byte)0xcd,
+        (byte)0x91,(byte)0xe3,(byte)0x91,(byte)0xee,(byte)0x91,
+        (byte)0xf2,(byte)0x91,(byte)0xf5,(byte)0x91,(byte)0xf9,
+        (byte)0x92,(byte)0x4c,(byte)0x92,(byte)0x51,(byte)0x92,
+        (byte)0x52,(byte)0x92,(byte)0x53,(byte)0x92,(byte)0x57,
+        (byte)0x92,(byte)0x69,(byte)0x92,(byte)0x74,(byte)0x92,
+        (byte)0x77,(byte)0x92,(byte)0xbd,(byte)0x92,(byte)0xc9,
+        (byte)0x92,(byte)0xd2,(byte)0x92,(byte)0xd7,(byte)0x92,
+        (byte)0xdb,(byte)0x92,(byte)0xe9,(byte)0x92,(byte)0xfa,
+        (byte)0x93,(byte)0x47,(byte)0x93,(byte)0x4b,(byte)0x93,
+        (byte)0x57,(byte)0x93,(byte)0x59,(byte)0x93,(byte)0x5b,
+        (byte)0x93,(byte)0x6f,(byte)0x93,(byte)0xa4,(byte)0x93,
+        (byte)0xb5,(byte)0x93,(byte)0xc1,(byte)0x93,(byte)0xc2,
+        (byte)0x93,(byte)0xcd,(byte)0x93,(byte)0xd4,(byte)0x93,
+        (byte)0xdd,(byte)0x93,(byte)0xe0,(byte)0x93,(byte)0xe4,
+        (byte)0x93,(byte)0xe9,(byte)0x93,(byte)0xeb,(byte)0x93,
+        (byte)0xf6,(byte)0x94,(byte)0x49,(byte)0x94,(byte)0x63,
+        (byte)0x94,(byte)0x64,(byte)0x94,(byte)0x69,(byte)0x94,
+        (byte)0x6e,(byte)0x94,(byte)0x70,(byte)0x94,(byte)0x72,
+        (byte)0x94,(byte)0x75,(byte)0x94,(byte)0x79,(byte)0x94,
+        (byte)0x7e,(byte)0x94,(byte)0xa1,(byte)0x94,(byte)0xa3,
+        (byte)0x94,(byte)0xb5,(byte)0x94,(byte)0xb9,(byte)0x94,
+        (byte)0xbc,(byte)0x94,(byte)0xc9,(byte)0x94,(byte)0xd1,
+        (byte)0x94,(byte)0xd3,(byte)0x94,(byte)0xdb,(byte)0x94,
+        (byte)0xdd,(byte)0x94,(byte)0xde,(byte)0x94,(byte)0xec,
+        (byte)0x94,(byte)0xef,(byte)0x95,(byte)0x44,(byte)0x95,
+        (byte)0x5a,(byte)0x95,(byte)0x62,(byte)0x95,(byte)0x64,
+        (byte)0x95,(byte)0x73,(byte)0x95,(byte)0xb0,(byte)0x95,
+        (byte)0xb2,(byte)0x95,(byte)0xb3,(byte)0x95,(byte)0xb4,
+        (byte)0x95,(byte)0xc6,(byte)0x95,(byte)0xc7,(byte)0x95,
+        (byte)0xcd,(byte)0x95,(byte)0xd1,(byte)0x95,(byte)0xd6,
+        (byte)0x95,(byte)0xdb,(byte)0x95,(byte)0xdf,(byte)0x95,
+        (byte)0xec,(byte)0x95,(byte)0xf0,(byte)0x95,(byte)0xf6,
+        (byte)0x95,(byte)0xfc,(byte)0x96,(byte)0x41,(byte)0x96,
+        (byte)0x4d,(byte)0x96,(byte)0x5c,(byte)0x96,(byte)0x62,
+        (byte)0x96,(byte)0x64,(byte)0x96,(byte)0x69,(byte)0x96,
+        (byte)0x6b,(byte)0x96,(byte)0x75,(byte)0x96,(byte)0x78,
+        (byte)0x96,(byte)0x79,(byte)0x96,(byte)0xa6,(byte)0x96,
+        (byte)0xa8,(byte)0x96,(byte)0xb9,(byte)0x96,(byte)0xbc,
+        (byte)0x96,(byte)0xc8,(byte)0x96,(byte)0xd4,(byte)0x96,
+        (byte)0xd6,(byte)0x96,(byte)0xdf,(byte)0x96,(byte)0xe9,
+        (byte)0x96,(byte)0xf7,(byte)0x97,(byte)0x43,(byte)0x97,
+        (byte)0x45,(byte)0x97,(byte)0x46,(byte)0x97,(byte)0x5d,
+        (byte)0x97,(byte)0x61,(byte)0x97,(byte)0x66,(byte)0x97,
+        (byte)0x7c,(byte)0x97,(byte)0xae,(byte)0x97,(byte)0xb0,
+        (byte)0x97,(byte)0xb8,(byte)0x97,(byte)0xba,(byte)0x97,
+        (byte)0xc0,(byte)0x97,(byte)0xc2,(byte)0x97,(byte)0xc3,
+        (byte)0x97,(byte)0xc5,(byte)0x97,(byte)0xc6,(byte)0x97,
+        (byte)0xc9,(byte)0x97,(byte)0xcd,(byte)0x97,(byte)0xd2,
+        (byte)0x97,(byte)0xd7,(byte)0x97,(byte)0xda,(byte)0x97,
+        (byte)0xdb,(byte)0x97,(byte)0xdc,(byte)0x97,(byte)0xdd,
+        (byte)0x97,(byte)0xde,(byte)0x97,(byte)0xe1,(byte)0x97,
+        (byte)0xe7,(byte)0x97,(byte)0xfd,(byte)0x97,(byte)0xfe,
+        (byte)0x98,(byte)0x53,(byte)0x98,(byte)0x56,(byte)0x98,
+        (byte)0x72,(byte)0x98,(byte)0x79,(byte)0x98,(byte)0xa8,
+        (byte)0x98,(byte)0xbc,(byte)0x98,(byte)0xc3,(byte)0x98,
+        (byte)0xc5,(byte)0x98,(byte)0xcb,(byte)0x98,(byte)0xcc,
+        (byte)0x98,(byte)0xcd,(byte)0x98,(byte)0xce,(byte)0x98,
+        (byte)0xd0,(byte)0x98,(byte)0xd1,(byte)0x98,(byte)0xd6,
+        (byte)0x98,(byte)0xd9,(byte)0x98,(byte)0xdb,(byte)0x98,
+        (byte)0xdd,(byte)0x98,(byte)0xe4,(byte)0x98,(byte)0xe6,
+        (byte)0x98,(byte)0xe8,(byte)0x98,(byte)0xe9,(byte)0x98,
+        (byte)0xeb,(byte)0x98,(byte)0xec,(byte)0x98,(byte)0xf4,
+        (byte)0x98,(byte)0xfe,(byte)0x99,(byte)0x40,(byte)0x99,
+        (byte)0x46,(byte)0x99,(byte)0x48,(byte)0x99,(byte)0x4b,
+        (byte)0x99,(byte)0x4e,(byte)0x99,(byte)0x55,(byte)0x99,
+        (byte)0x56,(byte)0x99,(byte)0x59,(byte)0x99,(byte)0x5b,
+        (byte)0x99,(byte)0x67,(byte)0x99,(byte)0x6e,(byte)0x99,
+        (byte)0x73,(byte)0x99,(byte)0x7a,(byte)0x99,(byte)0x7b,
+        (byte)0x99,(byte)0xa1,(byte)0x99,(byte)0xa5,(byte)0x99,
+        (byte)0xa7,(byte)0x99,(byte)0xad,(byte)0x99,(byte)0xb3,
+        (byte)0x99,(byte)0xbc,(byte)0x99,(byte)0xc3,(byte)0x99,
+        (byte)0xc7,(byte)0x99,(byte)0xce,(byte)0x99,(byte)0xcf,
+        (byte)0x99,(byte)0xde,(byte)0x99,(byte)0xe1,(byte)0x99,
+        (byte)0xe9,(byte)0x99,(byte)0xf5,(byte)0x99,(byte)0xf8,
+        (byte)0x9a,(byte)0x48,(byte)0x9a,(byte)0x49,(byte)0x9a,
+        (byte)0x50,(byte)0x9a,(byte)0x55,(byte)0x9a,(byte)0x58,
+        (byte)0x9a,(byte)0x5a,(byte)0x9a,(byte)0x5c,(byte)0x9a,
+        (byte)0x60,(byte)0x9a,(byte)0x63,(byte)0x9a,(byte)0x6e,
+        (byte)0x9a,(byte)0x70,(byte)0x9a,(byte)0x79,(byte)0x9a,
+        (byte)0x7b,(byte)0x9a,(byte)0xbd,(byte)0x9a,(byte)0xec,
+        (byte)0x9b,(byte)0x4d,(byte)0x9b,(byte)0xa9,(byte)0x9b,
+        (byte)0xaa,(byte)0x9b,(byte)0xb8,(byte)0x9b,(byte)0xbe,
+        (byte)0x9b,(byte)0xc2,(byte)0x9b,(byte)0xdf,(byte)0x9b,
+        (byte)0xe3,(byte)0x9b,(byte)0xea,(byte)0x9b,(byte)0xee,
+        (byte)0x9c,(byte)0x4a,(byte)0x9c,(byte)0x5c,(byte)0x9c,
+        (byte)0x6f,(byte)0x9c,(byte)0x79,(byte)0x9c,(byte)0xa1,
+        (byte)0x9c,(byte)0xa5,(byte)0x9c,(byte)0xba,(byte)0x9c,
+        (byte)0xbb,(byte)0x9c,(byte)0xbe,(byte)0x9c,(byte)0xc6,
+        (byte)0x9c,(byte)0xc8,(byte)0x9c,(byte)0xd1,(byte)0x9c,
+        (byte)0xf8,(byte)0x9d,(byte)0x46,(byte)0x9d,(byte)0x49,
+        (byte)0x9d,(byte)0x4f,(byte)0x9d,(byte)0x51,(byte)0x9d,
+        (byte)0x5d,(byte)0x9d,(byte)0x73,(byte)0x9d,(byte)0x78,
+        (byte)0x9d,(byte)0x7b,(byte)0x9d,(byte)0xa5,(byte)0x9d,
+        (byte)0xaa,(byte)0x9d,(byte)0xad,(byte)0x9d,(byte)0xb5,
+        (byte)0x9d,(byte)0xcc,(byte)0x9d,(byte)0xce,(byte)0x9d,
+        (byte)0xee,(byte)0x9d,(byte)0xf3,(byte)0x9e,(byte)0x53,
+        (byte)0x9e,(byte)0x64,(byte)0x9e,(byte)0x7a,(byte)0x9e,
+        (byte)0x7e,(byte)0x9e,(byte)0xa4,(byte)0x9e,(byte)0xb4,
+        (byte)0x9e,(byte)0xb8,(byte)0x9e,(byte)0xb9,(byte)0x9e,
+        (byte)0xbb,(byte)0x9e,(byte)0xc5,(byte)0x9e,(byte)0xc9,
+        (byte)0x9e,(byte)0xcd,(byte)0x9e,(byte)0xda,(byte)0x9e,
+        (byte)0xdd,(byte)0x9e,(byte)0xde,(byte)0x9e,(byte)0xdf,
+        (byte)0x9e,(byte)0xe5,(byte)0x9e,(byte)0xe7,(byte)0x9e,
+        (byte)0xee,(byte)0x9e,(byte)0xf0,(byte)0x9e,(byte)0xfc,
+        (byte)0x9f,(byte)0x70,(byte)0x9f,(byte)0xa5,(byte)0x9f,
+        (byte)0xd7,(byte)0x9f,(byte)0xd9,(byte)0xa0,(byte)0x53,
+        (byte)0xa0,(byte)0x68,(byte)0xa0,(byte)0x6a,(byte)0xa0,
+        (byte)0x6f,(byte)0xa0,(byte)0x78,(byte)0xa0,(byte)0x7e,
+        (byte)0xa0,(byte)0xac,(byte)0xa0,(byte)0xd0,(byte)0xa0,
+        (byte)0xda,(byte)0xa0,(byte)0xde,(byte)0xa0,(byte)0xe6,
+        (byte)0xa0,(byte)0xf9,(byte)0xc6,(byte)0xcd,(byte)0xc8,
+        (byte)0xd6,(byte)0xc8,(byte)0xd7,(byte)0xc8,(byte)0xd8,
+        (byte)0xc8,(byte)0xd9,(byte)0xc8,(byte)0xda,(byte)0xc8,
+        (byte)0xdb,(byte)0xc8,(byte)0xdc,(byte)0xc8,(byte)0xdd,
+        (byte)0xc8,(byte)0xde,(byte)0xc8,(byte)0xdf,(byte)0xc8,
+        (byte)0xe0,(byte)0xc8,(byte)0xe1,(byte)0xc8,(byte)0xe2,
+        (byte)0xc8,(byte)0xe3,(byte)0xc8,(byte)0xe4,(byte)0xc8,
+        (byte)0xe5,(byte)0xc8,(byte)0xe6,(byte)0xc8,(byte)0xe7,
+        (byte)0xc8,(byte)0xe8,(byte)0xc8,(byte)0xe9,(byte)0xc8,
+        (byte)0xea,(byte)0xc8,(byte)0xeb,(byte)0xc8,(byte)0xec,
+        (byte)0xc8,(byte)0xed,(byte)0xc8,(byte)0xee,(byte)0xc8,
+        (byte)0xef,(byte)0xc8,(byte)0xf0,(byte)0xc8,(byte)0xf1,
+        (byte)0xfa,(byte)0x45,(byte)0xfa,(byte)0x48,(byte)0xfa,
+        (byte)0x68,(byte)0xfa,(byte)0x6b,(byte)0xfa,(byte)0xa5,
+        (byte)0xfa,(byte)0xcc,(byte)0xfa,(byte)0xcd,(byte)0xfa,
+        (byte)0xd0,(byte)0xfa,(byte)0xe0,(byte)0xfa,(byte)0xe8,
+        (byte)0xfa,(byte)0xfa,(byte)0xfa,(byte)0xfd,(byte)0xfb,
+        (byte)0x43,(byte)0xfb,(byte)0x4b,(byte)0xfb,(byte)0x5e,
+        (byte)0xfb,(byte)0x65,(byte)0xfb,(byte)0x70,(byte)0xfb,
+        (byte)0x7a,(byte)0xfb,(byte)0x7d,(byte)0xfb,(byte)0xb6,
+        (byte)0xfb,(byte)0xb9,(byte)0xfb,(byte)0xbf,(byte)0xfb,
+        (byte)0xc1,(byte)0xfb,(byte)0xc9,(byte)0xfb,(byte)0xca,
+        (byte)0xfb,(byte)0xd3,(byte)0xfb,(byte)0xdc,(byte)0xfb,
+        (byte)0xea,(byte)0xfb,(byte)0xef,(byte)0xfb,(byte)0xf0,
+        (byte)0xfc,(byte)0x42,(byte)0xfc,(byte)0x49,(byte)0xfc,
+        (byte)0x4a,(byte)0xfc,(byte)0x59,(byte)0xfc,(byte)0x64,
+        (byte)0xfc,(byte)0x65,(byte)0xfc,(byte)0x66,(byte)0xfc,
+        (byte)0x6a,(byte)0xfc,(byte)0xa6,(byte)0xfc,(byte)0xb4,
+        (byte)0xfc,(byte)0xc2,(byte)0xfc,(byte)0xc4,(byte)0xfc,
+        (byte)0xcf,(byte)0xfc,(byte)0xd1,(byte)0xfc,(byte)0xee,
+        (byte)0xfc,(byte)0xf7,(byte)0xfd,(byte)0x49,(byte)0xfd,
+        (byte)0x4a,(byte)0xfd,(byte)0x4c,(byte)0xfd,(byte)0x50,
+        (byte)0xfd,(byte)0x53,(byte)0xfd,(byte)0x5d,(byte)0xfd,
+        (byte)0x61,(byte)0xfd,(byte)0x6c,(byte)0xfd,(byte)0x7a,
+        (byte)0xfd,(byte)0xa2,(byte)0xfd,(byte)0xa3,(byte)0xfd,
+        (byte)0xc4,(byte)0xfd,(byte)0xca,(byte)0xfd,(byte)0xce,
+        (byte)0xfd,(byte)0xd1,(byte)0xfd,(byte)0xe8,(byte)0xfd,
+        (byte)0xe9,(byte)0xfe,(byte)0x4d,(byte)0xfe,(byte)0x56,
+        (byte)0xfe,(byte)0x64,(byte)0xfe,(byte)0x6e,(byte)0xfe,
+        (byte)0x78,(byte)0xfe,(byte)0x7d,(byte)0xfe,(byte)0xb6,
+        (byte)0xfe,(byte)0xc5,(byte)0xfe,(byte)0xfb };
+
+    public static void main(String[] args) throws Exception {
+        byte[] encodedBytes = new byte[1000];
+
+        encodedBytes = uni21String.getBytes("Big5-HKSCS");
+
+        for (int i = 0; i < encodedBytes.length - 1; i++) {
+            if (encodedBytes[i] != expectedBytes[i]
+                || encodedBytes[i+1] != expectedBytes[i+1]) {
+           throw new Exception("Unexpected char->byte HKSCS mappings");
+            }
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/TestX11JIS0201.java b/jdk/test/sun/nio/cs/TestX11JIS0201.java
new file mode 100644
index 0000000..dea3e6b
--- /dev/null
+++ b/jdk/test/sun/nio/cs/TestX11JIS0201.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4195325
+ * @summary name() should return "X11JIS0201"
+ *
+ */
+
+import java.nio.charset.*;
+
+public class TestX11JIS0201 {
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        Class cl = null;
+        try {
+            cl = Class.forName("sun.awt.motif.X11JIS0201");
+        } catch (Exception e){
+            return;
+        }
+        Charset cs = (Charset)cl.newInstance();
+        if (! cs.name().equals("X11JIS0201")){
+            throw new Exception("X11JIS0201 does not work correctly");
+        }
+    }
+}
diff --git a/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java
new file mode 100644
index 0000000..d025d28
--- /dev/null
+++ b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+   @bug 4890726
+   @summary Check the correctness of KOI8_U by comparing to KOI8_R
+ */
+
+import java.util.*;
+import static java.lang.Character.UnicodeBlock;
+
+public class UkrainianIsNotRussian {
+    private static String decode(byte[] bytes, String encoding) throws Throwable {
+        String s = new String(bytes, encoding);
+        equal(s.length(), 1);
+        check(Arrays.equals(s.getBytes(encoding), bytes));
+        return s;
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        final byte[] bytes = new byte[1];
+        int differences = 0;
+        for (int i = 0; i < 0xff; i++) {
+            bytes[0] = (byte) i;
+            final String r = decode(bytes, "KOI8_R");
+            final String u = decode(bytes, "KOI8_U");
+            if (! r.equals(u)) {
+                differences++;
+                final char rc = r.charAt(0);
+                final char uc = u.charAt(0);
+                final UnicodeBlock rcb = UnicodeBlock.of(rc);
+                final UnicodeBlock ucb = UnicodeBlock.of(uc);
+                System.out.printf("%02x => %04x %s, %04x %s%n",
+                                  i, (int) rc, rcb, (int) uc, ucb);
+                check(rcb == UnicodeBlock.BOX_DRAWING &&
+                      ucb == UnicodeBlock.CYRILLIC);
+            }
+        }
+        equal(differences, 8);
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
diff --git a/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java
new file mode 100644
index 0000000..dd5b5cf
--- /dev/null
+++ b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4522270
+   @summary Ensure that a zeroed byte array produces a valid String when EUC-TW  decoded
+
+ */
+
+public class ZeroedByteArrayEUCTWTest
+{
+    public static void main(String[] args) throws Exception {
+        test("cns11643");
+    }
+
+    public static void test(String encoding) throws Exception {
+        String result = null;
+        byte[] data = new byte[16];
+
+        for (int i = 0; i < 16; i++) {
+            data[i] = 0;
+        }
+
+        result = new String(data, encoding);
+        if (result.length() != 16)
+            throw new Exception ("EUC_TW regression test bugID 4522270 failed");
+
+        for (int i=0; i < 16; i++) {
+            data[i] = (byte)( 32 + i);
+        }
+    }
+}
diff --git a/langtools/.hgtags b/langtools/.hgtags
index d176853..3ef9e4a 100644
--- a/langtools/.hgtags
+++ b/langtools/.hgtags
@@ -4,3 +4,4 @@
 a17265993253d61becd04fe7d96d1fe8b4bd6dff jdk7-b27
 4ef4bd31856949554967fbf22783babb21a62a0e jdk7-b28
 dec081837b01d509dcc2b9de86a4299c1ec17e04 jdk7-b29
+eaf608c64fecf70f955dc9f29f94c055b183aeec jdk7-b30
diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
index c27b025..59b909c 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
@@ -100,9 +100,12 @@
 
         boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
         boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
+        boolean enforceMandatoryWarnings = source.enforceMandatoryWarnings();
 
-        deprecationHandler = new MandatoryWarningHandler(log,verboseDeprecated, "deprecated");
-        uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked, "unchecked");
+        deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated,
+                enforceMandatoryWarnings, "deprecated");
+        uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked,
+                enforceMandatoryWarnings, "unchecked");
     }
 
     /** Switch: generics enabled?
@@ -1367,13 +1370,47 @@
                         types.isSameType(rt1, rt2) ||
                         rt1.tag >= CLASS && rt2.tag >= CLASS &&
                         (types.covariantReturnType(rt1, rt2, Warner.noWarnings) ||
-                         types.covariantReturnType(rt2, rt1, Warner.noWarnings));
+                         types.covariantReturnType(rt2, rt1, Warner.noWarnings)) ||
+                         checkCommonOverriderIn(s1,s2,site);
                     if (!compat) return s2;
                 }
             }
         }
         return null;
     }
+    //WHERE
+    boolean checkCommonOverriderIn(Symbol s1, Symbol s2, Type site) {
+        Map<TypeSymbol,Type> supertypes = new HashMap<TypeSymbol,Type>();
+        Type st1 = types.memberType(site, s1);
+        Type st2 = types.memberType(site, s2);
+        closure(site, supertypes);
+        for (Type t : supertypes.values()) {
+            for (Scope.Entry e = t.tsym.members().lookup(s1.name); e.scope != null; e = e.next()) {
+                Symbol s3 = e.sym;
+                if (s3 == s1 || s3 == s2 || s3.kind != MTH || (s3.flags() & (BRIDGE|SYNTHETIC)) != 0) continue;
+                Type st3 = types.memberType(site,s3);
+                if (types.overrideEquivalent(st3, st1) && types.overrideEquivalent(st3, st2)) {
+                    if (s3.owner == site.tsym) {
+                        return true;
+                    }
+                    List<Type> tvars1 = st1.getTypeArguments();
+                    List<Type> tvars2 = st2.getTypeArguments();
+                    List<Type> tvars3 = st3.getTypeArguments();
+                    Type rt1 = st1.getReturnType();
+                    Type rt2 = st2.getReturnType();
+                    Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1);
+                    Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2);
+                    boolean compat =
+                        rt13.tag >= CLASS && rt23.tag >= CLASS &&
+                        (types.covariantReturnType(rt13, rt1, Warner.noWarnings) &&
+                         types.covariantReturnType(rt23, rt2, Warner.noWarnings));
+                    if (compat)
+                        return true;
+                }
+            }
+        }
+        return false;
+    }
 
     /** Check that a given method conforms with any method it overrides.
      *  @param tree         The tree from which positions are extracted
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java b/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java
index eaa910d..e66ae93 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java
@@ -25,6 +25,7 @@
 
 package com.sun.tools.javac.file;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
@@ -36,6 +37,9 @@
 import static javax.tools.JavaFileObject.Kind.*;
 
 public abstract class BaseFileObject implements JavaFileObject {
+    protected BaseFileObject(JavacFileManager fileManager) {
+        this.fileManager = fileManager;
+    }
 
     public JavaFileObject.Kind getKind() {
         String n = getName();
@@ -76,4 +80,14 @@
         throw new UnsupportedOperationException();
     }
 
+    protected abstract String inferBinaryName(Iterable<? extends File> path);
+
+    protected static String removeExtension(String fileName) {
+        int lastDot = fileName.lastIndexOf(".");
+        return (lastDot == -1 ? fileName : fileName.substring(0, lastDot));
+    }
+
+    /** The file manager that created this JavaFileObject. */
+    protected final JavacFileManager fileManager;
+
 }
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java
index 3658cd8..86fc3f2 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java
@@ -25,21 +25,16 @@
 
 package com.sun.tools.javac.file;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.io.Writer;
 import java.lang.ref.SoftReference;
 import java.net.MalformedURLException;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.ByteBuffer;
@@ -56,13 +51,11 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 import javax.lang.model.SourceVersion;
@@ -96,15 +89,6 @@
 
     boolean useZipFileIndex;
 
-    private static int symbolFilePrefixLength = 0;
-    static {
-        try {
-            symbolFilePrefixLength = symbolFilePrefix.getBytes("UTF-8").length;
-        } catch (java.io.UnsupportedEncodingException uee) {
-            // Can't happen...UTF-8 is always supported.
-        }
-    }
-
     private static boolean CHECK_ZIP_TIMESTAMP = false;
     private static Map<File, Boolean> isDirectory = new ConcurrentHashMap<File, Boolean>();
 
@@ -202,7 +186,7 @@
     }
 
     public JavaFileObject getRegularFile(File file) {
-        return new RegularFileObject(file);
+        return new RegularFileObject(this, file);
     }
 
     public JavaFileObject getFileForOutput(String classname,
@@ -405,7 +389,7 @@
                 } else {
                     if (isValidFile(fname, fileKinds)) {
                         JavaFileObject fe =
-                        new RegularFileObject(fname, new File(d, fname));
+                            new RegularFileObject(this, fname, new File(d, fname));
                         l.append(fe);
                     }
                 }
@@ -469,106 +453,13 @@
         Set<String> getSubdirectories();
     }
 
-    public class ZipArchive implements Archive {
-        protected final Map<String,List<String>> map;
-        protected final ZipFile zdir;
-        public ZipArchive(ZipFile zdir) throws IOException {
-            this.zdir = zdir;
-            this.map = new HashMap<String,List<String>>();
-            for (Enumeration<? extends ZipEntry> e = zdir.entries(); e.hasMoreElements(); ) {
-                ZipEntry entry;
-                try {
-                    entry = e.nextElement();
-                } catch (InternalError ex) {
-                    IOException io = new IOException();
-                    io.initCause(ex); // convenience constructors added in Mustang :-(
-                    throw io;
-                }
-                addZipEntry(entry);
-            }
-        }
-
-        void addZipEntry(ZipEntry entry) {
-            String name = entry.getName();
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return;
-            List<String> list = map.get(dirname);
-            if (list == null)
-                list = List.nil();
-            list = list.prepend(basename);
-            map.put(dirname, list);
-        }
-
-        public boolean contains(String name) {
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return false;
-            List<String> list = map.get(dirname);
-            return (list != null && list.contains(basename));
-        }
-
-        public List<String> getFiles(String subdirectory) {
-            return map.get(subdirectory);
-        }
-
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            ZipEntry ze = zdir.getEntry(subdirectory + file);
-            return new ZipFileObject(file, zdir, ze);
-        }
-
-        public Set<String> getSubdirectories() {
-            return map.keySet();
-        }
-
-        public void close() throws IOException {
-            zdir.close();
-        }
-    }
-
-    public class SymbolArchive extends ZipArchive {
-        final File origFile;
-        public SymbolArchive(File orig, ZipFile zdir) throws IOException {
-            super(zdir);
-            this.origFile = orig;
-        }
-
-        @Override
-        void addZipEntry(ZipEntry entry) {
-            // called from super constructor, may not refer to origFile.
-            String name = entry.getName();
-            if (!name.startsWith(symbolFilePrefix))
-                return;
-            name = name.substring(symbolFilePrefix.length());
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return;
-            List<String> list = map.get(dirname);
-            if (list == null)
-                list = List.nil();
-            list = list.prepend(basename);
-            map.put(dirname, list);
-        }
-
-        @Override
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            return super.getFileObject(symbolFilePrefix + subdirectory, file);
-        }
-    }
-
     public class MissingArchive implements Archive {
         final File zipFileName;
         public MissingArchive(File name) {
             zipFileName = name;
         }
         public boolean contains(String name) {
-              return false;
+            return false;
         }
 
         public void close() {
@@ -647,25 +538,30 @@
 
                 if (origZipFileName == zipFileName) {
                     if (!useZipFileIndex) {
-                        archive = new ZipArchive(zdir);
+                        archive = new ZipArchive(this, zdir);
                     } else {
-                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, 0,
+                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, null,
                                 usePreindexedCache, preindexCacheLocation, options.get("writezipindexfiles") != null));
                     }
                 }
                 else {
                     if (!useZipFileIndex) {
-                        archive = new SymbolArchive(origZipFileName, zdir);
+                        archive = new SymbolArchive(this, origZipFileName, zdir, symbolFilePrefix);
                     }
                     else {
-                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, symbolFilePrefixLength,
-                                usePreindexedCache, preindexCacheLocation, options.get("writezipindexfiles") != null));
+                        archive = new ZipFileIndexArchive(this,
+                                ZipFileIndex.getZipFileIndex(zipFileName,
+                                symbolFilePrefix,
+                                usePreindexedCache,
+                                preindexCacheLocation,
+                                options.get("writezipindexfiles") != null));
                     }
                 }
             } catch (FileNotFoundException ex) {
                 archive = new MissingArchive(zipFileName);
             } catch (IOException ex) {
-                log.error("error.reading.file", zipFileName, ex.getLocalizedMessage());
+                if (zipFileName.exists())
+                    log.error("error.reading.file", zipFileName, ex.getLocalizedMessage());
                 archive = new MissingArchive(zipFileName);
             }
 
@@ -694,7 +590,17 @@
         }
     }
 
-    private Map<JavaFileObject, SoftReference<CharBuffer>> contentCache = new HashMap<JavaFileObject, SoftReference<CharBuffer>>();
+    CharBuffer getCachedContent(JavaFileObject file) {
+        SoftReference<CharBuffer> r = contentCache.get(file);
+        return (r == null ? null : r.get());
+    }
+
+    void cache(JavaFileObject file, CharBuffer cb) {
+        contentCache.put(file, new SoftReference<CharBuffer>(cb));
+    }
+
+    private final Map<JavaFileObject, SoftReference<CharBuffer>> contentCache
+            = new HashMap<JavaFileObject, SoftReference<CharBuffer>>();
 
     private String defaultEncodingName;
     private String getDefaultEncodingName() {
@@ -724,7 +630,7 @@
     /**
      * Make a byte buffer from an input stream.
      */
-    private ByteBuffer makeByteBuffer(InputStream in)
+    ByteBuffer makeByteBuffer(InputStream in)
         throws IOException {
         int limit = in.available();
         if (mmappedIO && in instanceof FileInputStream) {
@@ -750,6 +656,10 @@
         return (ByteBuffer)result.flip();
     }
 
+    void recycleByteBuffer(ByteBuffer bb) {
+        byteBufferCache.put(bb);
+    }
+
     /**
      * A single-element cache of direct byte buffers.
      */
@@ -768,9 +678,10 @@
             cached = x;
         }
     }
+
     private final ByteBufferCache byteBufferCache;
 
-    private CharsetDecoder getDecoder(String encodingName, boolean ignoreEncodingErrors) {
+    CharsetDecoder getDecoder(String encodingName, boolean ignoreEncodingErrors) {
         Charset charset = (this.charset == null)
             ? Charset.forName(encodingName)
             : this.charset;
@@ -790,7 +701,7 @@
     /**
      * Decode a ByteBuffer into a CharBuffer.
      */
-    private CharBuffer decode(ByteBuffer inbuf, boolean ignoreEncodingErrors) {
+    CharBuffer decode(ByteBuffer inbuf, boolean ignoreEncodingErrors) {
         String encodingName = getEncodingName();
         CharsetDecoder decoder;
         try {
@@ -900,48 +811,14 @@
         // Need to match the path semantics of list(location, ...)
         Iterable<? extends File> path = getLocation(location);
         if (path == null) {
-            //System.err.println("Path for " + location + " is null");
             return null;
         }
-        //System.err.println("Path for " + location + " is " + path);
 
-        if (file instanceof RegularFileObject) {
-            RegularFileObject r = (RegularFileObject) file;
-            String rPath = r.getPath();
-            //System.err.println("RegularFileObject " + file + " " +r.getPath());
-            for (File dir: path) {
-                //System.err.println("dir: " + dir);
-                String dPath = dir.getPath();
-                if (!dPath.endsWith(File.separator))
-                    dPath += File.separator;
-                if (rPath.regionMatches(true, 0, dPath, 0, dPath.length())
-                    && new File(rPath.substring(0, dPath.length())).equals(new File(dPath))) {
-                    String relativeName = rPath.substring(dPath.length());
-                    return removeExtension(relativeName).replace(File.separatorChar, '.');
-                }
-            }
-        } else if (file instanceof ZipFileObject) {
-            ZipFileObject z = (ZipFileObject) file;
-            String entryName = z.getZipEntryName();
-            if (entryName.startsWith(symbolFilePrefix))
-                entryName = entryName.substring(symbolFilePrefix.length());
-            return removeExtension(entryName).replace('/', '.');
-        } else if (file instanceof ZipFileIndexFileObject) {
-            ZipFileIndexFileObject z = (ZipFileIndexFileObject) file;
-            String entryName = z.getZipEntryName();
-            if (entryName.startsWith(symbolFilePrefix))
-                entryName = entryName.substring(symbolFilePrefix.length());
-            return removeExtension(entryName).replace(File.separatorChar, '.');
+        if (file instanceof BaseFileObject) {
+            return ((BaseFileObject) file).inferBinaryName(path);
         } else
             throw new IllegalArgumentException(file.getClass().getName());
-        // System.err.println("inferBinaryName failed for " + file);
-        return null;
     }
-    // where
-        private static String removeExtension(String fileName) {
-            int lastDot = fileName.lastIndexOf(".");
-            return (lastDot == -1 ? fileName : fileName.substring(0, lastDot));
-        }
 
     public boolean isSameFile(FileObject a, FileObject b) {
         nullCheck(a);
@@ -1028,7 +905,7 @@
             if (dir.isDirectory()) {
                 File f = new File(dir, name.replace('/', File.separatorChar));
                 if (f.exists())
-                    return new RegularFileObject(f);
+                    return new RegularFileObject(this, f);
             } else {
                 Archive a = openArchive(dir);
                 if (a.contains(name)) {
@@ -1090,7 +967,7 @@
                 if (sibling != null && sibling instanceof RegularFileObject) {
                     siblingDir = ((RegularFileObject)sibling).f.getParentFile();
                 }
-                return new RegularFileObject(new File(siblingDir, baseName(fileName)));
+                return new RegularFileObject(this, new File(siblingDir, baseName(fileName)));
             }
         } else if (location == SOURCE_OUTPUT) {
             dir = (getSourceOutDir() != null ? getSourceOutDir() : getClassOutDir());
@@ -1104,7 +981,7 @@
         }
 
         File file = (dir == null ? new File(fileName) : new File(dir, fileName));
-        return new RegularFileObject(file);
+        return new RegularFileObject(this, file);
 
     }
 
@@ -1117,7 +994,7 @@
         else
             result = new ArrayList<RegularFileObject>();
         for (File f: files)
-            result.add(new RegularFileObject(nullCheck(f)));
+            result.add(new RegularFileObject(this, nullCheck(f)));
         return result;
     }
 
@@ -1267,452 +1144,4 @@
             t.getClass(); // null check
         return it;
     }
-
-    /**
-     * A subclass of JavaFileObject representing regular files.
-     */
-    private class RegularFileObject extends BaseFileObject {
-        /** Have the parent directories been created?
-         */
-        private boolean hasParents=false;
-
-        /** The file's name.
-         */
-        private String name;
-
-        /** The underlying file.
-         */
-        final File f;
-
-        public RegularFileObject(File f) {
-            this(f.getName(), f);
-        }
-
-        public RegularFileObject(String name, File f) {
-            if (f.isDirectory())
-                throw new IllegalArgumentException("directories not supported");
-            this.name = name;
-            this.f = f;
-        }
-
-        public InputStream openInputStream() throws IOException {
-            return new FileInputStream(f);
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            ensureParentDirectoriesExist();
-            return new FileOutputStream(f);
-        }
-
-        public Writer openWriter() throws IOException {
-            ensureParentDirectoriesExist();
-            return new OutputStreamWriter(new FileOutputStream(f), getEncodingName());
-        }
-
-        private void ensureParentDirectoriesExist() throws IOException {
-            if (!hasParents) {
-                File parent = f.getParentFile();
-                if (parent != null && !parent.exists()) {
-                    if (!parent.mkdirs()) {
-                        // if the mkdirs failed, it may be because another process concurrently
-                        // created the directory, so check if the directory got created
-                        // anyway before throwing an exception
-                        if (!parent.exists() || !parent.isDirectory())
-                            throw new IOException("could not create parent directories");
-                    }
-                }
-                hasParents = true;
-            }
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) {
-            cn.getClass(); // null check
-            if (kind == Kind.OTHER && getKind() != kind)
-                return false;
-            String n = cn + kind.extension;
-            if (name.equals(n))
-                return true;
-            if (name.equalsIgnoreCase(n)) {
-                try {
-                    // allow for Windows
-                    return (f.getCanonicalFile().getName().equals(n));
-                } catch (IOException e) {
-                }
-            }
-            return false;
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return f.getPath();
-        }
-
-        public long getLastModified() {
-            return f.lastModified();
-        }
-
-        public boolean delete() {
-            return f.delete();
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = new FileInputStream(f);
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof RegularFileObject))
-                return false;
-            RegularFileObject o = (RegularFileObject) other;
-            try {
-                return f.equals(o.f)
-                    || f.getCanonicalFile().equals(o.f.getCanonicalFile());
-            } catch (IOException e) {
-                return false;
-            }
-        }
-
-        @Override
-        public int hashCode() {
-            return f.hashCode();
-        }
-
-        public URI toUri() {
-            try {
-                // Do no use File.toURI to avoid file system access
-                String path = f.getAbsolutePath().replace(File.separatorChar, '/');
-                return new URI("file://" + path).normalize();
-            } catch (URISyntaxException ex) {
-                return f.toURI();
-            }
-        }
-
-    }
-
-    /**
-     * A subclass of JavaFileObject representing zip entries.
-     */
-    public class ZipFileObject extends BaseFileObject {
-
-        /** The entry's name.
-         */
-        private String name;
-
-        /** The zipfile containing the entry.
-         */
-        ZipFile zdir;
-
-        /** The underlying zip entry object.
-         */
-        ZipEntry entry;
-
-        public ZipFileObject(String name, ZipFile zdir, ZipEntry entry) {
-            this.name = name;
-            this.zdir = zdir;
-            this.entry = entry;
-        }
-
-        public InputStream openInputStream() throws IOException {
-            return zdir.getInputStream(entry);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public Writer openWriter() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
-            cn.getClass(); // null check
-            if (k == Kind.OTHER && getKind() != k)
-                return false;
-            return name.equals(cn + k.extension);
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return zdir.getName() + "(" + entry + ")";
-        }
-
-        public long getLastModified() {
-            return entry.getTime();
-        }
-
-        public boolean delete() {
-            throw new UnsupportedOperationException();
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = zdir.getInputStream(entry);
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ZipFileObject))
-                return false;
-            ZipFileObject o = (ZipFileObject) other;
-            return zdir.equals(o.zdir) || name.equals(o.name);
-        }
-
-        @Override
-        public int hashCode() {
-            return zdir.hashCode() + name.hashCode();
-        }
-
-        public String getZipName() {
-            return zdir.getName();
-        }
-
-        public String getZipEntryName() {
-            return entry.getName();
-        }
-
-        public URI toUri() {
-            String zipName = new File(getZipName()).toURI().normalize().getPath();
-            String entryName = getZipEntryName();
-            return URI.create("jar:" + zipName + "!" + entryName);
-        }
-
-    }
-
-    /**
-     * A subclass of JavaFileObject representing zip entries using the com.sun.tools.javac.zip.ZipFileIndex implementation.
-     */
-    public class ZipFileIndexFileObject extends BaseFileObject {
-
-            /** The entry's name.
-         */
-        private String name;
-
-        /** The zipfile containing the entry.
-         */
-        ZipFileIndex zfIndex;
-
-        /** The underlying zip entry object.
-         */
-        ZipFileIndexEntry entry;
-
-        /** The InputStream for this zip entry (file.)
-         */
-        InputStream inputStream = null;
-
-        /** The name of the zip file where this entry resides.
-         */
-        String zipName;
-
-        JavacFileManager defFileManager = null;
-
-        public ZipFileIndexFileObject(JavacFileManager fileManager, ZipFileIndex zfIndex, ZipFileIndexEntry entry, String zipFileName) {
-            super();
-            this.name = entry.getFileName();
-            this.zfIndex = zfIndex;
-            this.entry = entry;
-            this.zipName = zipFileName;
-            defFileManager = fileManager;
-        }
-
-        public InputStream openInputStream() throws IOException {
-
-            if (inputStream == null) {
-                inputStream = new ByteArrayInputStream(read());
-            }
-            return inputStream;
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        public Writer openWriter() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
-            cn.getClass(); // null check
-            if (k == Kind.OTHER && getKind() != k)
-                return false;
-            return name.equals(cn + k.extension);
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return zipName + "(" + entry.getName() + ")";
-        }
-
-        public long getLastModified() {
-            return entry.getLastModified();
-        }
-
-        public boolean delete() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ZipFileIndexFileObject))
-                return false;
-            ZipFileIndexFileObject o = (ZipFileIndexFileObject) other;
-            return entry.equals(o.entry);
-        }
-
-        @Override
-        public int hashCode() {
-            return zipName.hashCode() + (name.hashCode() << 10);
-        }
-
-        public String getZipName() {
-            return zipName;
-        }
-
-        public String getZipEntryName() {
-            return entry.getName();
-        }
-
-        public URI toUri() {
-            String zipName = new File(getZipName()).toURI().normalize().getPath();
-            String entryName = getZipEntryName();
-            if (File.separatorChar != '/') {
-                entryName = entryName.replace(File.separatorChar, '/');
-            }
-            return URI.create("jar:" + zipName + "!" + entryName);
-        }
-
-        private byte[] read() throws IOException {
-            if (entry == null) {
-                entry = zfIndex.getZipIndexEntry(name);
-                if (entry == null)
-                  throw new FileNotFoundException();
-            }
-            return zfIndex.read(entry);
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = defFileManager.contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = new ByteArrayInputStream(zfIndex.read(entry));
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        defFileManager.contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-    }
-
-    public class ZipFileIndexArchive implements Archive {
-        private final ZipFileIndex zfIndex;
-        private JavacFileManager fileManager;
-
-        public ZipFileIndexArchive(JavacFileManager fileManager, ZipFileIndex zdir) throws IOException {
-            this.fileManager = fileManager;
-            this.zfIndex = zdir;
-        }
-
-        public boolean contains(String name) {
-            return zfIndex.contains(name);
-        }
-
-        public com.sun.tools.javac.util.List<String> getFiles(String subdirectory) {
-              return zfIndex.getFiles(((subdirectory.endsWith("/") || subdirectory.endsWith("\\"))? subdirectory.substring(0, subdirectory.length() - 1) : subdirectory));
-        }
-
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            String fullZipFileName = subdirectory + file;
-            ZipFileIndexEntry entry = zfIndex.getZipIndexEntry(fullZipFileName);
-            JavaFileObject ret = new ZipFileIndexFileObject(fileManager, zfIndex, entry, zfIndex.getZipFile().getPath());
-            return ret;
-        }
-
-        public Set<String> getSubdirectories() {
-            return zfIndex.getAllDirectories();
-        }
-
-        public void close() throws IOException {
-            zfIndex.close();
-        }
-    }
 }
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java b/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java
new file mode 100644
index 0000000..a2a4b2b
--- /dev/null
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.javac.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+import javax.tools.JavaFileObject;
+
+/**
+ * A subclass of JavaFileObject representing regular files.
+ */
+class RegularFileObject extends BaseFileObject {
+
+    /** Have the parent directories been created?
+     */
+    private boolean hasParents = false;
+    private String name;
+    final File f;
+
+    public RegularFileObject(JavacFileManager fileManager, File f) {
+        this(fileManager, f.getName(), f);
+    }
+
+    public RegularFileObject(JavacFileManager fileManager, String name, File f) {
+        super(fileManager);
+        if (f.isDirectory()) {
+            throw new IllegalArgumentException("directories not supported");
+        }
+        this.name = name;
+        this.f = f;
+    }
+
+    public InputStream openInputStream() throws IOException {
+        return new FileInputStream(f);
+    }
+
+    protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+        return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+    }
+
+    public OutputStream openOutputStream() throws IOException {
+        ensureParentDirectoriesExist();
+        return new FileOutputStream(f);
+    }
+
+    public Writer openWriter() throws IOException {
+        ensureParentDirectoriesExist();
+        return new OutputStreamWriter(new FileOutputStream(f), fileManager.getEncodingName());
+    }
+
+    @Override
+    protected String inferBinaryName(Iterable<? extends File> path) {
+        String fPath = f.getPath();
+        //System.err.println("RegularFileObject " + file + " " +r.getPath());
+        for (File dir: path) {
+            //System.err.println("dir: " + dir);
+            String dPath = dir.getPath();
+            if (!dPath.endsWith(File.separator))
+                dPath += File.separator;
+            if (fPath.regionMatches(true, 0, dPath, 0, dPath.length())
+                && new File(fPath.substring(0, dPath.length())).equals(new File(dPath))) {
+                String relativeName = fPath.substring(dPath.length());
+                return removeExtension(relativeName).replace(File.separatorChar, '.');
+            }
+        }
+        return null;
+    }
+
+    private void ensureParentDirectoriesExist() throws IOException {
+        if (!hasParents) {
+            File parent = f.getParentFile();
+            if (parent != null && !parent.exists()) {
+                if (!parent.mkdirs()) {
+                    if (!parent.exists() || !parent.isDirectory()) {
+                        throw new IOException("could not create parent directories");
+                    }
+                }
+            }
+            hasParents = true;
+        }
+    }
+
+    @Deprecated
+    public String getName() {
+        return name;
+    }
+
+    public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) {
+        cn.getClass();
+        // null check
+        if (kind == Kind.OTHER && getKind() != kind) {
+            return false;
+        }
+        String n = cn + kind.extension;
+        if (name.equals(n)) {
+            return true;
+        }
+        if (name.equalsIgnoreCase(n)) {
+            try {
+                // allow for Windows
+                return f.getCanonicalFile().getName().equals(n);
+            } catch (IOException e) {
+            }
+        }
+        return false;
+    }
+
+    @Deprecated
+    public String getPath() {
+        return f.getPath();
+    }
+
+    public long getLastModified() {
+        return f.lastModified();
+    }
+
+    public boolean delete() {
+        return f.delete();
+    }
+
+    public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+        CharBuffer cb = fileManager.getCachedContent(this);
+        if (cb == null) {
+            InputStream in = new FileInputStream(f);
+            try {
+                ByteBuffer bb = fileManager.makeByteBuffer(in);
+                JavaFileObject prev = fileManager.log.useSource(this);
+                try {
+                    cb = fileManager.decode(bb, ignoreEncodingErrors);
+                } finally {
+                    fileManager.log.useSource(prev);
+                }
+                fileManager.recycleByteBuffer(bb);
+                if (!ignoreEncodingErrors) {
+                    fileManager.cache(this, cb);
+                }
+            } finally {
+                in.close();
+            }
+        }
+        return cb;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof RegularFileObject)) {
+            return false;
+        }
+        RegularFileObject o = (RegularFileObject) other;
+        try {
+            return f.equals(o.f) || f.getCanonicalFile().equals(o.f.getCanonicalFile());
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return f.hashCode();
+    }
+
+    public URI toUri() {
+        try {
+            String path = f.getAbsolutePath().replace(File.separatorChar, '/');
+            return new URI("file://" + path).normalize();
+        } catch (URISyntaxException ex) {
+            return f.toURI();
+        }
+    }
+}
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java b/langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java
new file mode 100644
index 0000000..a4d4452
--- /dev/null
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.javac.file;
+
+import com.sun.tools.javac.util.List;
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import javax.tools.JavaFileObject;
+
+public class SymbolArchive extends ZipArchive {
+
+    final File origFile;
+    final String prefix;
+
+    public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, String prefix) throws IOException {
+        super(fileManager, zdir);
+        this.origFile = orig;
+        this.prefix = prefix;
+    }
+
+    @Override
+    void addZipEntry(ZipEntry entry) {
+        String name = entry.getName();
+        if (!name.startsWith(prefix)) {
+            return;
+        }
+        name = name.substring(prefix.length());
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i + 1);
+        String basename = name.substring(i + 1);
+        if (basename.length() == 0) {
+            return;
+        }
+        List<String> list = map.get(dirname);
+        if (list == null) {
+            list = List.nil();
+        }
+        list = list.prepend(basename);
+        map.put(dirname, list);
+    }
+
+    @Override
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        return super.getFileObject(prefix + subdirectory, file);
+    }
+}
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipArchive.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipArchive.java
new file mode 100644
index 0000000..b59bdd4
--- /dev/null
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipArchive.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.javac.file;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.file.JavacFileManager.Archive;
+import com.sun.tools.javac.util.List;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+
+public class ZipArchive implements Archive {
+
+    public ZipArchive(JavacFileManager fm, ZipFile zdir) throws IOException {
+        this.fileManager = fm;
+        this.zdir = zdir;
+        this.map = new HashMap<String,List<String>>();
+        for (Enumeration<? extends ZipEntry> e = zdir.entries(); e.hasMoreElements(); ) {
+            ZipEntry entry;
+            try {
+                entry = e.nextElement();
+            } catch (InternalError ex) {
+                IOException io = new IOException();
+                io.initCause(ex); // convenience constructors added in Mustang :-(
+                throw io;
+            }
+            addZipEntry(entry);
+        }
+    }
+
+    void addZipEntry(ZipEntry entry) {
+        String name = entry.getName();
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i+1);
+        String basename = name.substring(i+1);
+        if (basename.length() == 0)
+            return;
+        List<String> list = map.get(dirname);
+        if (list == null)
+            list = List.nil();
+        list = list.prepend(basename);
+        map.put(dirname, list);
+    }
+
+    public boolean contains(String name) {
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i+1);
+        String basename = name.substring(i+1);
+        if (basename.length() == 0)
+            return false;
+        List<String> list = map.get(dirname);
+        return (list != null && list.contains(basename));
+    }
+
+    public List<String> getFiles(String subdirectory) {
+        return map.get(subdirectory);
+    }
+
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        ZipEntry ze = zdir.getEntry(subdirectory + file);
+        return new ZipFileObject(this, file, ze);
+    }
+
+    public Set<String> getSubdirectories() {
+        return map.keySet();
+    }
+
+    public void close() throws IOException {
+        zdir.close();
+    }
+
+    protected JavacFileManager fileManager;
+    protected final Map<String,List<String>> map;
+    protected final ZipFile zdir;
+
+    /**
+     * A subclass of JavaFileObject representing zip entries.
+     */
+    public static class ZipFileObject extends BaseFileObject {
+
+        private String name;
+        ZipArchive zarch;
+        ZipEntry entry;
+
+        public ZipFileObject(ZipArchive zarch, String name, ZipEntry entry) {
+            super(zarch.fileManager);
+            this.zarch = zarch;
+            this.name = name;
+            this.entry = entry;
+        }
+
+        public InputStream openInputStream() throws IOException {
+            return zarch.zdir.getInputStream(entry);
+        }
+
+        public OutputStream openOutputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+            return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+        }
+
+        public Writer openWriter() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Deprecated
+        public String getName() {
+            return name;
+        }
+
+        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
+            cn.getClass();
+            // null check
+            if (k == Kind.OTHER && getKind() != k) {
+                return false;
+            }
+            return name.equals(cn + k.extension);
+        }
+
+        @Deprecated
+        public String getPath() {
+            return zarch.zdir.getName() + "(" + entry + ")";
+        }
+
+        public long getLastModified() {
+            return entry.getTime();
+        }
+
+        public boolean delete() {
+            throw new UnsupportedOperationException();
+        }
+
+        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            CharBuffer cb = fileManager.getCachedContent(this);
+            if (cb == null) {
+                InputStream in = zarch.zdir.getInputStream(entry);
+                try {
+                    ByteBuffer bb = fileManager.makeByteBuffer(in);
+                    JavaFileObject prev = fileManager.log.useSource(this);
+                    try {
+                        cb = fileManager.decode(bb, ignoreEncodingErrors);
+                    } finally {
+                        fileManager.log.useSource(prev);
+                    }
+                    fileManager.recycleByteBuffer(bb);
+                    if (!ignoreEncodingErrors) {
+                        fileManager.cache(this, cb);
+                    }
+                } finally {
+                    in.close();
+                }
+            }
+            return cb;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (!(other instanceof ZipFileObject)) {
+                return false;
+            }
+            ZipFileObject o = (ZipFileObject) other;
+            return zarch.zdir.equals(o.zarch.zdir) || name.equals(o.name);
+        }
+
+        @Override
+        public int hashCode() {
+            return zarch.zdir.hashCode() + name.hashCode();
+        }
+
+        public String getZipName() {
+            return zarch.zdir.getName();
+        }
+
+        public String getZipEntryName() {
+            return entry.getName();
+        }
+
+        public URI toUri() {
+            String zipName = new File(getZipName()).toURI().normalize().getPath();
+            String entryName = getZipEntryName();
+            return URI.create("jar:" + zipName + "!" + entryName);
+        }
+
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            String entryName = getZipEntryName();
+            if (zarch instanceof SymbolArchive) {
+                String prefix = ((SymbolArchive) zarch).prefix;
+                if (entryName.startsWith(prefix))
+                    entryName = entryName.substring(prefix.length());
+            }
+            return removeExtension(entryName).replace('/', '.');
+        }
+    }
+
+}
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java
index 89e3152..d677e2b 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java
@@ -81,11 +81,12 @@
     private File zipFile;
     private long zipFileLastModified = NOT_MODIFIED;
     private RandomAccessFile zipRandomFile;
-    private ZipFileIndexEntry[] entries;
+    private Entry[] entries;
 
     private boolean readFromIndex = false;
     private File zipIndexFile = null;
     private boolean triedToReadIndex = false;
+    final String symbolFilePrefix;
     private int symbolFilePrefixLength = 0;
     private boolean hasPopulatedData = false;
     private long lastReferenceTimeStamp = NOT_MODIFIED;
@@ -141,14 +142,14 @@
         }
     }
 
-    public static ZipFileIndex getZipFileIndex(File zipFile, int symbolFilePrefixLen, boolean useCache, String cacheLocation, boolean writeIndex) throws IOException {
+    public static ZipFileIndex getZipFileIndex(File zipFile, String symbolFilePrefix, boolean useCache, String cacheLocation, boolean writeIndex) throws IOException {
         ZipFileIndex zi = null;
         lock.lock();
         try {
             zi = getExistingZipIndex(zipFile);
 
             if (zi == null || (zi != null && zipFile.lastModified() != zi.zipFileLastModified)) {
-                zi = new ZipFileIndex(zipFile, symbolFilePrefixLen, writeIndex,
+                zi = new ZipFileIndex(zipFile, symbolFilePrefix, writeIndex,
                         useCache, cacheLocation);
                 zipFileIndexCache.put(zipFile, zi);
             }
@@ -229,10 +230,12 @@
         }
     }
 
-    private ZipFileIndex(File zipFile, int symbolFilePrefixLen, boolean writeIndex,
+    private ZipFileIndex(File zipFile, String symbolFilePrefix, boolean writeIndex,
             boolean useCache, String cacheLocation) throws IOException {
         this.zipFile = zipFile;
-        this.symbolFilePrefixLength = symbolFilePrefixLen;
+        this.symbolFilePrefix = symbolFilePrefix;
+        this.symbolFilePrefixLength = (symbolFilePrefix == null ? 0 :
+            symbolFilePrefix.getBytes("UTF-8").length);
         this.writeIndex = writeIndex;
         this.usePreindexedCache = useCache;
         this.preindexedCacheLocation = cacheLocation;
@@ -312,7 +315,7 @@
 
     private void cleanupState() {
         // Make sure there is a valid but empty index if the file doesn't exist
-        entries = ZipFileIndexEntry.EMPTY_ARRAY;
+        entries = Entry.EMPTY_ARRAY;
         directories = Collections.<String, DirectoryEntry>emptyMap();
         zipFileLastModified = NOT_MODIFIED;
         allDirs = Collections.<String>emptySet();
@@ -342,7 +345,7 @@
     /**
      * Returns the ZipFileIndexEntry for an absolute path, if there is one.
      */
-    public ZipFileIndexEntry getZipIndexEntry(String path) {
+    Entry getZipIndexEntry(String path) {
         if (File.separatorChar != '/') {
             path = path.replace('/', File.separatorChar);
         }
@@ -493,7 +496,7 @@
     public long getLastModified(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
             return entry.getLastModified();
@@ -506,7 +509,7 @@
     public int length(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
 
@@ -530,7 +533,7 @@
     public byte[] read(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException(MessageFormat.format("Path not found in ZIP: {0}", path));
             return read(entry);
@@ -540,7 +543,7 @@
         }
     }
 
-    public byte[] read(ZipFileIndexEntry entry) throws IOException {
+    byte[] read(Entry entry) throws IOException {
         lock.lock();
         try {
             openFile();
@@ -556,7 +559,7 @@
     public int read(String path, byte[] buffer) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
             return read(entry, buffer);
@@ -566,7 +569,7 @@
         }
     }
 
-    public int read(ZipFileIndexEntry entry, byte[] buffer)
+    int read(Entry entry, byte[] buffer)
             throws IOException {
         lock.lock();
         try {
@@ -578,7 +581,7 @@
         }
     }
 
-    private byte[] readBytes(ZipFileIndexEntry entry) throws IOException {
+    private byte[] readBytes(Entry entry) throws IOException {
         byte[] header = getHeader(entry);
         int csize = entry.compressedSize;
         byte[] cbuf = new byte[csize];
@@ -600,7 +603,7 @@
     /**
      *
      */
-    private int readBytes(ZipFileIndexEntry entry, byte[] buffer) throws IOException {
+    private int readBytes(Entry entry, byte[] buffer) throws IOException {
         byte[] header = getHeader(entry);
 
         // entry is not compressed?
@@ -633,7 +636,7 @@
     // Zip utilities
     //----------------------------------------------------------------------------
 
-    private byte[] getHeader(ZipFileIndexEntry entry) throws IOException {
+    private byte[] getHeader(Entry entry) throws IOException {
         zipRandomFile.seek(entry.offset);
         byte[] header = new byte[30];
         zipRandomFile.readFully(header);
@@ -746,11 +749,11 @@
         private void buildIndex() throws IOException {
             int entryCount = get2ByteLittleEndian(zipDir, 0);
 
-            entries = new ZipFileIndexEntry[entryCount];
+            entries = new Entry[entryCount];
             // Add each of the files
             if (entryCount > 0) {
                 directories = new HashMap<String, DirectoryEntry>();
-                ArrayList<ZipFileIndexEntry> entryList = new ArrayList<ZipFileIndexEntry>();
+                ArrayList<Entry> entryList = new ArrayList<Entry>();
                 int pos = 2;
                 for (int i = 0; i < entryCount; i++) {
                     pos = readEntry(pos, entryList, directories);
@@ -759,19 +762,19 @@
                 // Add the accumulated dirs into the same list
                 Iterator i = directories.keySet().iterator();
                 while (i.hasNext()) {
-                    ZipFileIndexEntry zipFileIndexEntry = new ZipFileIndexEntry( (String) i.next());
+                    Entry zipFileIndexEntry = new Entry( (String) i.next());
                     zipFileIndexEntry.isDir = true;
                     entryList.add(zipFileIndexEntry);
                 }
 
-                entries = entryList.toArray(new ZipFileIndexEntry[entryList.size()]);
+                entries = entryList.toArray(new Entry[entryList.size()]);
                 Arrays.sort(entries);
             } else {
                 cleanupState();
             }
         }
 
-        private int readEntry(int pos, List<ZipFileIndexEntry> entryList,
+        private int readEntry(int pos, List<Entry> entryList,
                 Map<String, DirectoryEntry> directories) throws IOException {
             if (get4ByteLittleEndian(zipDir, pos) != 0x02014b50) {
                 throw new ZipException("cannot read zip file entry");
@@ -838,7 +841,7 @@
 
             // For each dir create also a file
             if (fileStart != fileEnd) {
-                ZipFileIndexEntry entry = new ZipFileIndexEntry(directory,
+                Entry entry = new Entry(directory,
                         new String(zipDir, fileStart, fileEnd - fileStart, "UTF-8"));
 
                 entry.setNativeTime(get4ByteLittleEndian(zipDir, pos + 12));
@@ -873,6 +876,7 @@
     /** ------------------------------------------------------------------------
      *  DirectoryEntry class
      * -------------------------------------------------------------------------*/
+
     static class DirectoryEntry {
         private boolean filesInited;
         private boolean directoriesInited;
@@ -885,9 +889,9 @@
 
         private com.sun.tools.javac.util.List<String> zipFileEntriesFiles = com.sun.tools.javac.util.List.<String>nil();
         private com.sun.tools.javac.util.List<String> zipFileEntriesDirectories = com.sun.tools.javac.util.List.<String>nil();
-        private com.sun.tools.javac.util.List<ZipFileIndexEntry>  zipFileEntries = com.sun.tools.javac.util.List.<ZipFileIndexEntry>nil();
+        private com.sun.tools.javac.util.List<Entry>  zipFileEntries = com.sun.tools.javac.util.List.<Entry>nil();
 
-        private List<ZipFileIndexEntry> entries = new ArrayList<ZipFileIndexEntry>();
+        private List<Entry> entries = new ArrayList<Entry>();
 
         private ZipFileIndex zipFileIndex;
 
@@ -916,7 +920,7 @@
 
             initEntries();
 
-            for (ZipFileIndexEntry e : entries) {
+            for (Entry e : entries) {
                 if (!e.isDir) {
                     zipFileEntriesFiles = zipFileEntriesFiles.append(e.name);
                 }
@@ -932,7 +936,7 @@
 
             initEntries();
 
-            for (ZipFileIndexEntry e : entries) {
+            for (Entry e : entries) {
                 if (e.isDir) {
                     zipFileEntriesDirectories = zipFileEntriesDirectories.append(e.name);
                 }
@@ -943,7 +947,7 @@
             return zipFileEntriesDirectories;
         }
 
-        private com.sun.tools.javac.util.List<ZipFileIndexEntry> getEntries() {
+        private com.sun.tools.javac.util.List<Entry> getEntries() {
             if (zipFileEntriesInited) {
                 return zipFileEntries;
             }
@@ -951,7 +955,7 @@
             initEntries();
 
             zipFileEntries = com.sun.tools.javac.util.List.nil();
-            for (ZipFileIndexEntry zfie : entries) {
+            for (Entry zfie : entries) {
                 zipFileEntries = zipFileEntries.append(zfie);
             }
 
@@ -960,9 +964,9 @@
             return zipFileEntries;
         }
 
-        private ZipFileIndexEntry getEntry(String rootName) {
+        private Entry getEntry(String rootName) {
             initEntries();
-            int index = Collections.binarySearch(entries, new ZipFileIndexEntry(dirName, rootName));
+            int index = Collections.binarySearch(entries, new Entry(dirName, rootName));
             if (index < 0) {
                 return null;
             }
@@ -977,9 +981,9 @@
 
             if (!zipFileIndex.readFromIndex) {
                 int from = -Arrays.binarySearch(zipFileIndex.entries,
-                        new ZipFileIndexEntry(dirName, ZipFileIndex.MIN_CHAR)) - 1;
+                        new Entry(dirName, ZipFileIndex.MIN_CHAR)) - 1;
                 int to = -Arrays.binarySearch(zipFileIndex.entries,
-                        new ZipFileIndexEntry(dirName, MAX_CHAR)) - 1;
+                        new Entry(dirName, MAX_CHAR)) - 1;
 
                 boolean emptyList = false;
 
@@ -1016,7 +1020,7 @@
                             // Read java time stamp of the file in the real Jar/Zip file
                             long eJavaTimestamp = raf.readLong();
 
-                            ZipFileIndexEntry rfie = new ZipFileIndexEntry(dirName, eName);
+                            Entry rfie = new Entry(dirName, eName);
                             rfie.isDir = eIsDir;
                             rfie.offset = eOffset;
                             rfie.size = eSize;
@@ -1041,7 +1045,7 @@
             entriesInited = true;
         }
 
-        List<ZipFileIndexEntry> getEntriesAsCollection() {
+        List<Entry> getEntriesAsCollection() {
             initEntries();
 
             return entries;
@@ -1173,8 +1177,8 @@
                 raf.seek(currFP);
 
                 // Now write each of the files in the DirectoryEntry
-                List<ZipFileIndexEntry> entries = de.getEntriesAsCollection();
-                for (ZipFileIndexEntry zfie : entries) {
+                List<Entry> entries = de.getEntriesAsCollection();
+                for (Entry zfie : entries) {
                     // Write the name bytes
                     byte [] zfieNameBytes = zfie.name.getBytes("UTF-8");
                     int zfieNameBytesLen = zfieNameBytes.length;
@@ -1245,4 +1249,94 @@
     public File getZipFile() {
         return zipFile;
     }
+
+
+    static class Entry implements Comparable<Entry> {
+        public static final Entry[] EMPTY_ARRAY = {};
+
+        // Directory related
+        String dir;
+        boolean isDir;
+
+        // File related
+        String name;
+
+        int offset;
+        int size;
+        int compressedSize;
+        long javatime;
+
+        private int nativetime;
+
+        public Entry(String path) {
+            int separator = path.lastIndexOf(File.separatorChar);
+            if (separator == -1) {
+                dir = "".intern();
+                name = path;
+            } else {
+                dir = path.substring(0, separator).intern();
+                name = path.substring(separator + 1);
+            }
+        }
+
+        public Entry(String directory, String name) {
+            this.dir = directory.intern();
+            this.name = name;
+        }
+
+        public String getName() {
+            if (dir == null || dir.length() == 0) {
+                return name;
+            }
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(dir);
+            sb.append(File.separatorChar);
+            sb.append(name);
+            return sb.toString();
+        }
+
+        public String getFileName() {
+            return name;
+        }
+
+        public long getLastModified() {
+            if (javatime == 0) {
+                    javatime = dosToJavaTime(nativetime);
+            }
+            return javatime;
+        }
+
+        // From java.util.zip
+        private static long dosToJavaTime(int nativetime) {
+            // Bootstrap build problems prevent me from using the code directly
+            // Convert the raw/native time to a long for now
+            return (long)nativetime;
+        }
+
+        void setNativeTime(int natTime) {
+            nativetime = natTime;
+        }
+
+        public boolean isDirectory() {
+            return isDir;
+        }
+
+        public int compareTo(Entry other) {
+            String otherD = other.dir;
+            if (dir != otherD) {
+                int c = dir.compareTo(otherD);
+                if (c != 0)
+                    return c;
+            }
+            return name.compareTo(other.name);
+        }
+
+
+        public String toString() {
+            return isDir ? ("Dir:" + dir + " : " + name) :
+                (dir + ":" + name);
+        }
+    }
+
 }
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java
new file mode 100644
index 0000000..8fa7896
--- /dev/null
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.javac.file;
+
+import java.io.IOException;
+import java.util.Set;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.file.JavacFileManager.Archive;
+import com.sun.tools.javac.util.List;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+
+public class ZipFileIndexArchive implements Archive {
+
+    private final ZipFileIndex zfIndex;
+    private JavacFileManager fileManager;
+
+    public ZipFileIndexArchive(JavacFileManager fileManager, ZipFileIndex zdir) throws IOException {
+        super();
+        this.fileManager = fileManager;
+        this.zfIndex = zdir;
+    }
+
+    public boolean contains(String name) {
+        return zfIndex.contains(name);
+    }
+
+    public List<String> getFiles(String subdirectory) {
+        return zfIndex.getFiles((subdirectory.endsWith("/") || subdirectory.endsWith("\\")) ? subdirectory.substring(0, subdirectory.length() - 1) : subdirectory);
+    }
+
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        String fullZipFileName = subdirectory + file;
+        ZipFileIndex.Entry entry = zfIndex.getZipIndexEntry(fullZipFileName);
+        JavaFileObject ret = new ZipFileIndexFileObject(fileManager, zfIndex, entry, zfIndex.getZipFile().getPath());
+        return ret;
+    }
+
+    public Set<String> getSubdirectories() {
+        return zfIndex.getAllDirectories();
+    }
+
+    public void close() throws IOException {
+        zfIndex.close();
+    }
+
+    /**
+     * A subclass of JavaFileObject representing zip entries using the com.sun.tools.javac.file.ZipFileIndex implementation.
+     */
+    public static class ZipFileIndexFileObject extends BaseFileObject {
+
+        /** The entry's name.
+         */
+        private String name;
+
+        /** The zipfile containing the entry.
+         */
+        ZipFileIndex zfIndex;
+
+        /** The underlying zip entry object.
+         */
+        ZipFileIndex.Entry entry;
+
+        /** The InputStream for this zip entry (file.)
+         */
+        InputStream inputStream = null;
+
+        /** The name of the zip file where this entry resides.
+         */
+        String zipName;
+
+
+        ZipFileIndexFileObject(JavacFileManager fileManager, ZipFileIndex zfIndex, ZipFileIndex.Entry entry, String zipFileName) {
+            super(fileManager);
+            this.name = entry.getFileName();
+            this.zfIndex = zfIndex;
+            this.entry = entry;
+            this.zipName = zipFileName;
+        }
+
+        public InputStream openInputStream() throws IOException {
+
+            if (inputStream == null) {
+                inputStream = new ByteArrayInputStream(read());
+            }
+            return inputStream;
+        }
+
+        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+            return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+        }
+
+        public OutputStream openOutputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Writer openWriter() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        /** @deprecated see bug 6410637 */
+        @Deprecated
+        public String getName() {
+            return name;
+        }
+
+        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
+            cn.getClass(); // null check
+            if (k == Kind.OTHER && getKind() != k)
+                return false;
+            return name.equals(cn + k.extension);
+        }
+
+        /** @deprecated see bug 6410637 */
+        @Deprecated
+        public String getPath() {
+            return zipName + "(" + entry.getName() + ")";
+        }
+
+        public long getLastModified() {
+            return entry.getLastModified();
+        }
+
+        public boolean delete() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (!(other instanceof ZipFileIndexFileObject))
+                return false;
+            ZipFileIndexFileObject o = (ZipFileIndexFileObject) other;
+            return entry.equals(o.entry);
+        }
+
+        @Override
+        public int hashCode() {
+            return zipName.hashCode() + (name.hashCode() << 10);
+        }
+
+        public String getZipName() {
+            return zipName;
+        }
+
+        public String getZipEntryName() {
+            return entry.getName();
+        }
+
+        public URI toUri() {
+            String zipName = new File(getZipName()).toURI().normalize().getPath();
+            String entryName = getZipEntryName();
+            if (File.separatorChar != '/') {
+                entryName = entryName.replace(File.separatorChar, '/');
+            }
+            return URI.create("jar:" + zipName + "!" + entryName);
+        }
+
+        private byte[] read() throws IOException {
+            if (entry == null) {
+                entry = zfIndex.getZipIndexEntry(name);
+                if (entry == null)
+                  throw new FileNotFoundException();
+            }
+            return zfIndex.read(entry);
+        }
+
+        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            CharBuffer cb = fileManager.getCachedContent(this);
+            if (cb == null) {
+                InputStream in = new ByteArrayInputStream(zfIndex.read(entry));
+                try {
+                    ByteBuffer bb = fileManager.makeByteBuffer(in);
+                    JavaFileObject prev = fileManager.log.useSource(this);
+                    try {
+                        cb = fileManager.decode(bb, ignoreEncodingErrors);
+                    } finally {
+                        fileManager.log.useSource(prev);
+                    }
+                    fileManager.recycleByteBuffer(bb); // save for next time
+                    if (!ignoreEncodingErrors)
+                        fileManager.cache(this, cb);
+                } finally {
+                    in.close();
+                }
+            }
+            return cb;
+        }
+
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            String entryName = getZipEntryName();
+            if (zfIndex.symbolFilePrefix != null) {
+                String prefix = zfIndex.symbolFilePrefix;
+                if (entryName.startsWith(prefix))
+                    entryName = entryName.substring(prefix.length());
+            }
+            return removeExtension(entryName).replace(File.separatorChar, '.');
+        }
+    }
+
+}
diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexEntry.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexEntry.java
deleted file mode 100644
index 17b851a..0000000
--- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexEntry.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2007-2008 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.javac.file;
-
-import java.io.File;
-
-public final class ZipFileIndexEntry implements Comparable<ZipFileIndexEntry> {
-    public static final ZipFileIndexEntry[] EMPTY_ARRAY = {};
-
-    // Directory related
-    String dir;
-    boolean isDir;
-
-    // File related
-    String name;
-
-    int offset;
-    int size;
-    int compressedSize;
-    long javatime;
-
-    private int nativetime;
-
-    public ZipFileIndexEntry(String path) {
-        int separator = path.lastIndexOf(File.separatorChar);
-        if (separator == -1) {
-            dir = "".intern();
-            name = path;
-        } else {
-            dir = path.substring(0, separator).intern();
-            name = path.substring(separator + 1);
-        }
-    }
-
-    public ZipFileIndexEntry(String directory, String name) {
-        this.dir = directory.intern();
-        this.name = name;
-    }
-
-    public String getName() {
-        if (dir == null || dir.length() == 0) {
-            return name;
-        }
-
-        StringBuilder sb = new StringBuilder();
-        sb.append(dir);
-        sb.append(File.separatorChar);
-        sb.append(name);
-        return sb.toString();
-    }
-
-    public String getFileName() {
-        return name;
-    }
-
-    public long getLastModified() {
-        if (javatime == 0) {
-                javatime = dosToJavaTime(nativetime);
-        }
-        return javatime;
-    }
-
-    // From java.util.zip
-    private static long dosToJavaTime(int nativetime) {
-        // Bootstrap build problems prevent me from using the code directly
-        // Convert the raw/native time to a long for now
-        return (long)nativetime;
-    }
-
-    void setNativeTime(int natTime) {
-        nativetime = natTime;
-    }
-
-    public boolean isDirectory() {
-        return isDir;
-    }
-
-    public int compareTo(ZipFileIndexEntry other) {
-        String otherD = other.dir;
-        if (dir != otherD) {
-            int c = dir.compareTo(otherD);
-            if (c != 0)
-                return c;
-        }
-        return name.compareTo(other.name);
-    }
-
-
-    public String toString() {
-        return isDir ? ("Dir:" + dir + " : " + name) :
-            (dir + ":" + name);
-    }
-}
diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
index b0f66ef..d9e6070 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
@@ -1056,7 +1056,7 @@
     void readClassAttr(ClassSymbol c, Name attrName, int attrLen) {
         if (attrName == names.SourceFile) {
             Name n = readName(nextChar());
-            c.sourcefile = new SourceFileObject(n);
+            c.sourcefile = new SourceFileObject(n, c.flatname);
         } else if (attrName == names.InnerClasses) {
             readInnerClasses(c);
         } else if (allowGenerics && attrName == names.Signature) {
@@ -2221,9 +2221,12 @@
         /** The file's name.
          */
         private Name name;
+        private Name flatname;
 
-        public SourceFileObject(Name name) {
+        public SourceFileObject(Name name, Name flatname) {
+            super(null); // no file manager; never referenced for this file object
             this.name = name;
+            this.flatname = flatname;
         }
 
         public InputStream openInputStream() {
@@ -2285,5 +2288,9 @@
             throw new UnsupportedOperationException();
         }
 
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            return flatname.toString();
+        }
     }
 }
diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
index 6e0fcdb..93bdd54 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
@@ -34,7 +34,6 @@
 import javax.tools.DiagnosticListener;
 import javax.tools.JavaFileObject;
 
-import com.sun.tools.javac.code.Source;
 import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.tree.JCTree;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -86,10 +85,6 @@
      */
     public boolean emitWarnings;
 
-    /** Enforce mandatory warnings.
-     */
-    private boolean enforceMandatoryWarnings;
-
     /** Print stack trace on errors?
      */
     public boolean dumpOnError;
@@ -138,9 +133,6 @@
         DiagnosticListener<? super JavaFileObject> diagListener =
             context.get(DiagnosticListener.class);
         this.diagListener = diagListener;
-
-        Source source = Source.instance(context);
-        this.enforceMandatoryWarnings = source.enforceMandatoryWarnings();
     }
     // where
         private int getIntOption(Options options, String optionName, int defaultValue) {
@@ -473,10 +465,7 @@
      *  @param args   Fields of the warning message.
      */
     public void mandatoryWarning(DiagnosticPosition pos, String key, Object ... args) {
-        if (enforceMandatoryWarnings)
-            report(diags.mandatoryWarning(source, pos, key, args));
-        else
-            report(diags.warning(source, pos, key, args));
+        report(diags.mandatoryWarning(source, pos, key, args));
     }
 
     /** Report a warning that cannot be suppressed.
@@ -514,34 +503,43 @@
     }
 
     /** Provide a non-fatal notification, unless suppressed by the -nowarn option.
+     *  @param file   The file to which the note applies.
+     *  @param key    The key for the localized notification message.
+     *  @param args   Fields of the notification message.
+     */
+    public void note(JavaFileObject file, String key, Object ... args) {
+        report(diags.note(wrap(file), null, key, args));
+    }
+
+    /** Provide a non-fatal notification, unless suppressed by the -nowarn option.
      *  @param key    The key for the localized notification message.
      *  @param args   Fields of the notification message.
      */
     public void mandatoryNote(final JavaFileObject file, String key, Object ... args) {
-        JCDiagnostic.DiagnosticSource wrapper = null;
-        if (file != null) {
-            wrapper = new JCDiagnostic.DiagnosticSource() {
-                    public JavaFileObject getFile() {
-                        return file;
-                    }
-                    public CharSequence getName() {
-                        return JavacFileManager.getJavacBaseFileName(getFile());
-                    }
-                    public int getLineNumber(int pos) {
-                        return Log.this.getLineNumber(pos);
-                    }
-                    public int getColumnNumber(int pos) {
-                        return Log.this.getColumnNumber(pos);
-                    }
-                    public Map<JCTree, Integer> getEndPosTable() {
-                        return (endPosTables == null ? null : endPosTables.get(file));
-                    }
-                };
+        report(diags.mandatoryNote(wrap(file), key, args));
+    }
+
+    private JCDiagnostic.DiagnosticSource wrap(final JavaFileObject file) {
+        if (file == null) {
+            return null;
         }
-        if (enforceMandatoryWarnings)
-            report(diags.mandatoryNote(wrapper, key, args));
-        else
-            report(diags.note(wrapper, null, key, args));
+        return new JCDiagnostic.DiagnosticSource() {
+            public JavaFileObject getFile() {
+                return file;
+            }
+            public CharSequence getName() {
+                return JavacFileManager.getJavacBaseFileName(getFile());
+            }
+            public int getLineNumber(int pos) {
+                return Log.this.getLineNumber(pos);
+            }
+            public int getColumnNumber(int pos) {
+                return Log.this.getColumnNumber(pos);
+            }
+            public Map<JCTree, Integer> getEndPosTable() {
+                return (endPosTables == null ? null : endPosTables.get(file));
+            }
+        };
     }
 
     private DiagnosticPosition wrap(int pos) {
diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java b/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
index 53a5749..179955d 100644
--- a/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
@@ -101,13 +101,17 @@
      *                individual instances should be given, or whether an aggregate
      *                message should be generated at the end of the compilation.
      *                Typically set via  -Xlint:option.
+     * @param enforceMandatory
+     *                True if mandatory warnings and notes are being enforced.
      * @param prefix  A common prefix for the set of message keys for
      *                the messages that may be generated.
      */
-    public MandatoryWarningHandler(Log log, boolean verbose, String prefix) {
+    public MandatoryWarningHandler(Log log, boolean verbose,
+                                   boolean enforceMandatory, String prefix) {
         this.log = log;
         this.verbose = verbose;
         this.prefix = prefix;
+        this.enforceMandatory = enforceMandatory;
     }
 
     /**
@@ -122,7 +126,7 @@
 
             if (log.nwarnings < log.MaxWarnings) {
                 // generate message and remember the source file
-                log.mandatoryWarning(pos, msg, args);
+                logMandatoryWarning(pos, msg, args);
                 sourcesWithReportedWarnings.add(currentSource);
             } else if (deferredDiagnosticKind == null) {
                 // set up deferred message
@@ -163,12 +167,12 @@
     public void reportDeferredDiagnostic() {
         if (deferredDiagnosticKind != null) {
             if (deferredDiagnosticArg == null)
-                log.mandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix));
+                logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix));
             else
-                log.mandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg);
+                logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg);
 
             if (!verbose)
-                log.mandatoryNote(deferredDiagnosticSource, prefix + ".recompile");
+                logMandatoryNote(deferredDiagnosticSource, prefix + ".recompile");
         }
     }
 
@@ -224,4 +228,32 @@
      * deferredDiagnosticKind is updated.
      */
     private Object deferredDiagnosticArg;
+
+    /**
+     * True if mandatory warnings and notes are being enforced.
+     */
+    private final boolean enforceMandatory;
+
+    /**
+     * Reports a mandatory warning to the log.  If mandatory warnings
+     * are not being enforced, treat this as an ordinary warning.
+     */
+    private void logMandatoryWarning(DiagnosticPosition pos, String msg,
+                                     Object... args) {
+        if (enforceMandatory)
+            log.mandatoryWarning(pos, msg, args);
+        else
+            log.warning(pos, msg, args);
+    }
+
+    /**
+     * Reports a mandatory note to the log.  If mandatory notes are
+     * not being enforced, treat this as an ordinary note.
+     */
+    private void logMandatoryNote(JavaFileObject file, String msg, Object... args) {
+        if (enforceMandatory)
+            log.mandatoryNote(file, msg, args);
+        else
+            log.note(file, msg, args);
+    }
 }
diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java
index 83e72fd..12303e0 100644
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java
@@ -27,7 +27,9 @@
 
 import com.sun.tools.javac.code.Symbol.PackageSymbol;
 import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.file.ZipArchive.ZipFileObject;
 import com.sun.tools.javac.file.Old199;
+import com.sun.tools.javac.file.ZipFileIndexArchive;
 import com.sun.tools.javac.jvm.ClassReader;
 import com.sun.tools.javac.util.Context;
 
@@ -82,16 +84,16 @@
     protected void extraFileActions(PackageSymbol pack, JavaFileObject fo) {
         CharSequence fileName = Old199.getName(fo);
         if (docenv != null && fileName.equals("package.html")) {
-            if (fo instanceof JavacFileManager.ZipFileObject) {
-                JavacFileManager.ZipFileObject zfo = (JavacFileManager.ZipFileObject) fo;
+            if (fo instanceof ZipFileObject) {
+                ZipFileObject zfo = (ZipFileObject) fo;
                 String zipName = zfo.getZipName();
                 String entryName = zfo.getZipEntryName();
                 int lastSep = entryName.lastIndexOf("/");
                 String classPathName = entryName.substring(0, lastSep + 1);
                 docenv.getPackageDoc(pack).setDocPath(zipName, classPathName);
             }
-            else if (fo instanceof JavacFileManager.ZipFileIndexFileObject) {
-                JavacFileManager.ZipFileIndexFileObject zfo = (JavacFileManager.ZipFileIndexFileObject) fo;
+            else if (fo instanceof ZipFileIndexArchive.ZipFileIndexFileObject) {
+                ZipFileIndexArchive.ZipFileIndexFileObject zfo = (ZipFileIndexArchive.ZipFileIndexFileObject) fo;
                 String zipName = zfo.getZipName();
                 String entryName = zfo.getZipEntryName();
                 if (File.separatorChar != '/') {
diff --git a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java
index 53d54cc..2a9e87e 100644
--- a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java
+++ b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java
@@ -25,16 +25,13 @@
 
 package com.sun.tools.javap;
 
-import java.io.File;
 import java.io.PrintWriter;
 import java.nio.charset.Charset;
-import javax.tools.Diagnostic;
 import javax.tools.DiagnosticListener;
 import javax.tools.JavaFileObject;
 
 import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.JCDiagnostic;
 
 /**
  *  javap's implementation of JavaFileManager.
@@ -52,29 +49,8 @@
     static JavapFileManager create(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log, Options options) {
         Context javac_context = new Context();
 
-        if (dl != null) {
-            // Workaround bug 6625520: javac handles missing entries on classpath badly
-            // Ignore spurious errors for missing files
-            DiagnosticListener<JavaFileObject> wrapper = new DiagnosticListener<JavaFileObject>() {
-                public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
-                    if (diagnostic instanceof JCDiagnostic) {
-                        JCDiagnostic jcd = (JCDiagnostic) diagnostic;
-                        if (jcd.getCode().equals("compiler.err.error.reading.file")) {
-                            Object[] args = jcd.getArgs();
-                            if (args.length > 0 && args[0] != null && args[0].toString().length() > 0) {
-                                File f = new File(args[0].toString());
-                                if (!f.exists())
-                                    return;
-                            }
-                        }
-
-                    }
-                    dl.report(diagnostic);
-                }
-            };
-            javac_context.put(DiagnosticListener.class, wrapper);
-        }
-
+        if (dl != null)
+            javac_context.put(DiagnosticListener.class, dl);
         javac_context.put(com.sun.tools.javac.util.Log.outKey, log);
 
         return new JavapFileManager(javac_context, null);
diff --git a/langtools/test/tools/javac/T6358024.java b/langtools/test/tools/javac/T6358024.java
index 790aea9..ae464ef 100644
--- a/langtools/test/tools/javac/T6358024.java
+++ b/langtools/test/tools/javac/T6358024.java
@@ -36,6 +36,7 @@
 import com.sun.source.util.*;
 import com.sun.tools.javac.api.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
 
diff --git a/langtools/test/tools/javac/T6358166.java b/langtools/test/tools/javac/T6358166.java
index 6097719..c8ad00a 100644
--- a/langtools/test/tools/javac/T6358166.java
+++ b/langtools/test/tools/javac/T6358166.java
@@ -33,6 +33,7 @@
 import javax.lang.model.element.*;
 import javax.tools.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager; // disambiguate
 import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
diff --git a/langtools/test/tools/javac/T6358168.java b/langtools/test/tools/javac/T6358168.java
index 51cdfbf..9e40205 100644
--- a/langtools/test/tools/javac/T6358168.java
+++ b/langtools/test/tools/javac/T6358168.java
@@ -34,6 +34,7 @@
 import javax.lang.model.element.*;
 import javax.tools.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
diff --git a/langtools/test/tools/javac/T6625520.java b/langtools/test/tools/javac/T6625520.java
new file mode 100644
index 0000000..748adbf
--- /dev/null
+++ b/langtools/test/tools/javac/T6625520.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.util.*;
+import javax.tools.*;
+import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.util.*;
+
+/*
+ * @test
+ * @bug 6625520
+ * @summary javac handles missing entries on classpath badly
+ */
+public class T6625520 {
+    public static void main(String[] args) throws Exception {
+        new T6625520().run();
+    }
+
+    void run() throws Exception {
+        Context c = new Context();
+        DiagnosticCollector<JavaFileObject> dc =
+            new DiagnosticCollector<JavaFileObject>();
+        c.put(DiagnosticListener.class, dc);
+        StandardJavaFileManager fm = new JavacFileManager(c, false, null);
+        fm.setLocation(StandardLocation.CLASS_PATH,
+                       Arrays.asList(new File("DOES_NOT_EXIST.jar")));
+        FileObject fo = fm.getFileForInput(StandardLocation.CLASS_PATH,
+                                           "p", "C.java");
+        System.err.println(fo + "\n" + dc.getDiagnostics());
+        if (dc.getDiagnostics().size() > 0)
+            throw new Exception("unexpected diagnostics found");
+    }
+}
diff --git a/langtools/test/tools/javac/generics/6294779/T6294779a.java b/langtools/test/tools/javac/generics/6294779/T6294779a.java
new file mode 100644
index 0000000..5c88450
--- /dev/null
+++ b/langtools/test/tools/javac/generics/6294779/T6294779a.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile T6294779a.java
+ */
+
+public class T6294779a {
+
+    interface A {
+        A m();
+    }
+
+    interface B extends A {
+        B m();
+    }
+
+    interface C extends A {
+        C m();
+    }
+
+    interface D extends B, C {
+        D m();
+    }
+}
diff --git a/langtools/test/tools/javac/generics/6294779/T6294779b.java b/langtools/test/tools/javac/generics/6294779/T6294779b.java
new file mode 100644
index 0000000..92e03eb
--- /dev/null
+++ b/langtools/test/tools/javac/generics/6294779/T6294779b.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile T6294779b.java
+ */
+
+import java.util.*;
+
+class T6294779b {
+
+    interface I1<E> {
+        List<E> m();
+    }
+
+    interface I2<E> {
+        Queue<E> m();
+    }
+
+    interface I3<E> {
+        LinkedList<E> m();
+    }
+
+    interface I4<E> extends I1<E>, I2<E>, I3<E> {}
+}
diff --git a/langtools/test/tools/javac/generics/6294779/T6294779c.java b/langtools/test/tools/javac/generics/6294779/T6294779c.java
new file mode 100644
index 0000000..abd7d83
--- /dev/null
+++ b/langtools/test/tools/javac/generics/6294779/T6294779c.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile/fail T6294779c.java
+ */
+
+public class T6294779c<X> {
+
+    interface A {}
+
+    interface B {}
+
+    interface C {}
+
+    interface I1 {
+        T6294779c<? extends A> get();
+    }
+
+    interface I2 {
+        T6294779c<? extends B> get();
+    }
+
+    interface I3 {
+        T6294779c<? extends C> get();
+    }
+
+    interface I4 extends I1, I2, I3 {}
+}
diff --git a/langtools/test/tools/javadoc/sourceOption/SourceOption.java b/langtools/test/tools/javadoc/sourceOption/SourceOption.java
new file mode 100644
index 0000000..273dca3
--- /dev/null
+++ b/langtools/test/tools/javadoc/sourceOption/SourceOption.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6507179
+ * @summary Ensure that "-source" option isn't ignored.
+ * @author  Scott Seligman
+ */
+
+import com.sun.javadoc.*;
+
+public class SourceOption extends Doclet {
+
+    public static void main(String[] args) {
+        if (com.sun.tools.javadoc.Main.execute(
+                "javadoc",
+                "SourceOption",
+                new String[] {"-source", "1.3", "p"}) != 0)
+            throw new Error("Javadoc encountered warnings or errors.");
+    }
+
+    public static boolean start(RootDoc root) {
+        root.classes();         // force parser into action
+        return true;
+    }
+}
diff --git a/langtools/test/tools/javadoc/sourceOption/p/A.java b/langtools/test/tools/javadoc/sourceOption/p/A.java
new file mode 100644
index 0000000..6f6728f
--- /dev/null
+++ b/langtools/test/tools/javadoc/sourceOption/p/A.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package p;
+
+public class A {
+    boolean assert;     // illegal since 1.4
+    boolean enum;       // illegal since 5
+}
diff --git a/make/jprt.config b/make/jprt.config
index 2e2fbd0..d9b57f0 100644
--- a/make/jprt.config
+++ b/make/jprt.config
@@ -142,9 +142,15 @@
 	solaris_arch=i386
     fi
 
-    # Get the SS11 compilers into path (make sure it matches ALT setting)
-    compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/SS11/bin
-    compiler_name=SS11
+    # Get the compilers into path (make sure it matches ALT setting)
+    if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then
+        compiler_name=${JPRT_SOLARIS_COMPILER_NAME}
+    else
+        # FIXUP: Change to SS12 when validated
+	#compiler_name=SS12
+	compiler_name=SS11
+    fi
+    compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin
     ALT_COMPILER_PATH="${compiler_path}"
     export ALT_COMPILER_PATH
     dirMustExist "${compiler_path}" ALT_COMPILER_PATH